在Xcode 6.3下,NULL C ++引用地址的计算结果为非零

时间:2015-06-18 01:48:47

标签: c++ xcode pointers memory-alignment type-safety

与此问题类似: 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

但是没有建议修复。

这些天检查空指针的规范方法是什么?

2 个答案:

答案 0 :(得分:1)

您没有检查指针,而是检查引用。

引用不应该是nullptr,因为它们必须引用现有值。实际上你所做的*(AStruct*)0没有明确定义,因为引用不应该通过“解除引用”来生成未定义的行为,但这样你就可以触发问题。

如果客户端代码有AStruct&,那么可以确定引用指向某个东西,那么你就是在破坏这种情况。

如果您需要使用可以为null的引用,请使用指针,例如

AStruct* GetStruct()
{
  return nullptr;
}

if (!GetStruct())
{
  ...

代码在以前版本的Xcode中工作的事实表明这不是明确定义的代码。

答案 1 :(得分:1)

你那里没有指针; mys是一个参考。然后,当您检查&mys的值时,您正在检查引用的地址。