有没有一种安全的方法可以在 C++ 中将 void* 转换为 class 指针
Is there a safe way to cast void* to class pointer in C++
我正在使用 C 库,并且正在将“用户指针”传递给它。当我想获取用户指针时,库 return 将其设置为 void*
。我目前正在使用 static_cast
来取消引用原始指针的成员。
所以我的问题是:有没有办法检查 static_cast
是否成功?
据我所知,static_cast
不会 return a nullptr
失败,而是,如果我尝试取消引用生成的失败指针,它将是 UB 和可能会使程序崩溃...
是的,static_cast
在这里是正确的。
假设 void*
值仅在 C 库内部复制,如果将其转换为指针,static_cast
将 return 指向传递对象的原始指针值与原来相同的类型。
在某些情况下,您也可以转换为不同的类型,规则是 reinterpret_cast
的规则(它只是通过两个 static_cast
和 void*
中间转换)。
如果您将其转换为这些规则不允许的任何类型,例如不相关的 class 类型,尝试通过指针访问对象将导致未定义的行为。没有办法检测到这个错误。你需要注意自己正确地做。
my question is: is there a way to check if the static_cast
succeeded?
没有。它要么是正确的,要么你的程序会有 未定义的行为。
As far as I know static_cast
will not return a nullptr
on failure, but rather, if I attempt to de-reference the resulting failed pointer it would be UB
是的,正是这样。因此,在使用 static_cast
时,您必须确保 void*
实际上指向您要强制转换的类型的对象(或者是合法的向上或向下强制转换)。
我正在使用 C 库,并且正在将“用户指针”传递给它。当我想获取用户指针时,库 return 将其设置为 void*
。我目前正在使用 static_cast
来取消引用原始指针的成员。
所以我的问题是:有没有办法检查 static_cast
是否成功?
据我所知,static_cast
不会 return a nullptr
失败,而是,如果我尝试取消引用生成的失败指针,它将是 UB 和可能会使程序崩溃...
是的,static_cast
在这里是正确的。
假设 void*
值仅在 C 库内部复制,如果将其转换为指针,static_cast
将 return 指向传递对象的原始指针值与原来相同的类型。
在某些情况下,您也可以转换为不同的类型,规则是 reinterpret_cast
的规则(它只是通过两个 static_cast
和 void*
中间转换)。
如果您将其转换为这些规则不允许的任何类型,例如不相关的 class 类型,尝试通过指针访问对象将导致未定义的行为。没有办法检测到这个错误。你需要注意自己正确地做。
my question is: is there a way to check if the
static_cast
succeeded?
没有。它要么是正确的,要么你的程序会有 未定义的行为。
As far as I know
static_cast
will not return anullptr
on failure, but rather, if I attempt to de-reference the resulting failed pointer it would be UB
是的,正是这样。因此,在使用 static_cast
时,您必须确保 void*
实际上指向您要强制转换的类型的对象(或者是合法的向上或向下强制转换)。