强制reinterpret_cast返回nullptr
我正在为一个接收内存地址的函数创建单元测试 unsigned long
在函数内部,这个地址被reinterpret_cast编入了一个你的类的指针。
void my function(Address inputAdress ) // Address comes from: typedef unsigned long Address;
{
ClsMyClassThread* ptr = reinterpret_cast<ClsMyClassThread*>(inputAdress);
if(ptr == nullptr)
{
// Do something
}
}
该功能运作良好,但它创建单元测试时,我想不通我怎么能强迫ptr是nullptr(我想测试全覆盖)。这什么时候可以发生?这甚至可能吗?
谢谢!
回答
从reinterpret_cast转换点 3(强调我的):
- 任何整数或枚举类型的值都可以转换为指针类型。转换为足够大小的整数并返回相同指针类型的指针保证具有其原始值,否则无法安全地取消引用结果指针(不保证相反方向的往返转换;相同的指针可能有多个整数表示)不保证空指针常量
NULL或整数零会产生目标类型的空指针值;static_cast或隐式转换应用于此目的。
因此,执行此操作的迂腐正确方法(假设sizeof(Address)足够大)是:
myfunction(reinterpret_cast<Address>(static_cast<ClsMyClassThread*>(nullptr)));
而以下某些人的建议并不能保证有效:
myfunction(0);
回答
这些很可能会起作用:
my_function(NULL);
my_function(0);
Address a = 0;
my_function(a);
虽然在技术上绝对正确,但您需要:
my_function(reinterpret_cast<Address>(static_cast<ClsMyClassThread*>(nullptr)));
(标准保证从零到指针类型的转换是空指针值,只有当涉及的零是直接文字表达式时,而不是像inputAdress恰好具有零值的变量。因此,它使用两个逆reinterpret_cast表达式的保证。 )