与此问题类似: XCode 6.3 Warning : Comparison of address of 'myObject' not equal to null pointer is always true
使用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 )
这些都不起作用。
然后我注意到了警告:
Reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false
但是没有建议修复。
这些天检查空指针的规范方法是什么?
答案 0 :(得分:1)
您没有检查指针,而是检查引用。
引用不应该是nullptr
,因为它们必须引用现有值。实际上你所做的*(AStruct*)0
没有明确定义,因为引用不应该通过“解除引用”来生成未定义的行为,但这样你就可以触发问题。
如果客户端代码有AStruct&
,那么可以确定引用指向某个东西,那么你就是在破坏这种情况。
如果您需要使用可以为null的引用,请使用指针,例如
AStruct* GetStruct()
{
return nullptr;
}
if (!GetStruct())
{
...
代码在以前版本的Xcode中工作的事实表明这不是明确定义的代码。
答案 1 :(得分:1)
你那里没有指针; mys
是一个参考。然后,当您检查&mys
的值时,您正在检查引用的地址。