在 Xcode 6.3 下,NULL C++ 引用地址计算为非零
Under Xcode 6.3, NULL C++ reference address evaluates as non-zero
类似于这个问题:
使用 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 pointer\n");
}
return 0
}
这总是打印出来
NOT a null pointer
我尝试过其他检查指向引用的指针的方法:
if ( &mys == NULL)
if ( &mys == nullptr )
None 个有效。
然后我注意到警告:
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
没有明确定义,因为引用不应该能够通过 "dereferencing it" 生成未定义的行为,但这样你可能会触发问题。
如果客户端代码有 AStruct&
那么可以确定引用指向某物,你正在打破这个条件。
如果您需要使用可以为空的引用,请使用指针,例如
AStruct* GetStruct()
{
return nullptr;
}
if (!GetStruct())
{
...
该代码在 Xcode 的先前版本中运行的事实表明这不是定义明确的代码。
你那里没有指针; mys
是参考。然后当你检查&mys
的值时,你正在检查引用的地址。
类似于这个问题:
使用 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 pointer\n");
}
return 0
}
这总是打印出来
NOT a null pointer
我尝试过其他检查指向引用的指针的方法:
if ( &mys == NULL)
if ( &mys == nullptr )
None 个有效。
然后我注意到警告:
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
没有明确定义,因为引用不应该能够通过 "dereferencing it" 生成未定义的行为,但这样你可能会触发问题。
如果客户端代码有 AStruct&
那么可以确定引用指向某物,你正在打破这个条件。
如果您需要使用可以为空的引用,请使用指针,例如
AStruct* GetStruct()
{
return nullptr;
}
if (!GetStruct())
{
...
该代码在 Xcode 的先前版本中运行的事实表明这不是定义明确的代码。
你那里没有指针; mys
是参考。然后当你检查&mys
的值时,你正在检查引用的地址。