在 Xcode 6.3 下,NULL C++引用地址的计算结果为非零
Under Xcode 6.3, NULL C++ reference address evaluates as non-zero
类似于这个问题:XCode 6.3 警告:"myObject"的地址比较不等于空指针总是正确的
使用 C++,我发现以前用于评估空指针的工作代码停止工作:
struct AStruct
{
int x, y;
char *name;
};
AStruct& GetStruct()
{
return *(AStruct*)0;
}
int main(int argc, const char * argv[]) {
AStruct& mys = GetStruct();
if ( ! &mys) {
printf("null pointer n");
}
else
{
printf("NOT a null pointern");
}
return 0
}
这总是打印出来 NOT a null pointer
我尝试了其他指针到引用检查的方法:
if ( &mys == NULL)
if ( &mys == nullptr )
这些都不起作用。
然后我注意到警告:
Reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false
但是没有建议的修复。
如今检查空指针的规范方法是什么?
您不是在检查指针,而是在检查引用。
不应nullptr
引用,因为它们必须引用现有值。事实上,你正在做的事情*(AStruct*)0
没有很好地定义,因为引用不应该能够通过"取消引用它"来生成未定义的行为,但通过这种方式,你可能会触发问题。
如果客户端代码具有AStruct&
则可以确定引用指向某些内容,您正在破坏此条件。
如果您需要使用可以为 null 的引用,请使用指针,例如
AStruct* GetStruct()
{
return nullptr;
}
if (!GetStruct())
{
...
代码在以前版本的 Xcode 中工作的事实表明这不是定义良好的代码。
你那里没有指针; mys
是一个参考。然后,当您检查 &mys
的值时,您正在检查引用的地址。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 将数组的地址分配给变量并删除
- 递归函数计算序列中的平方和(并输出过程)
- 空基优化子对象的地址
- (C++)分析树以计算返回错误值的简单算术表达式
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 当我使用需要计算数组单元格地址的模板时,奇怪的C++行为
- 比特币隔离见证钱包地址计算
- 计算地址差异是未定义的行为吗?
- 计算以前对齐的地址
- C 在我的计算机上工作正常,但在Leetcode上获得地址消毒器堆越流行错误
- 为什么数组元素长度的地址计算可被 2 的幂整除更有效
- 根据对象的成员子对象之一的地址计算对象的地址
- 从缓冲区指针计算堆栈中的返回地址
- 在内存地址中计算 2 补码中的符号位
- 如何可靠地计算一个对象的内存地址
- ipv6地址的前缀长度计算
- 如何计算数组中的项.而不是内存地址
- 在 Xcode 6.3 下,NULL C++引用地址的计算结果为非零
- c++ Linux在同一台计算机上获取返回不同值的MAC地址