如何修复 "reference cannot be bound to dereferenced null pointer" 警告

How to fix "reference cannot be bound to dereferenced null pointer" warning

Xcode 6.3(测试版)给我新的警告,有什么解决问题的建议吗?我不认为完全删除支票是正确的答案,因为在某些情况下 "camera" 是 NULL 并导致其他地方后来崩溃。

Reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false

这是代码。我还能如何验证摄像头是否存在?

Camera& camera = sceneEngine->camera();
// FIXME: this triggers an undefined-bool-conversion warning in Xcode 6.3 BETA
if (&camera == NULL) return;

以及SceneEngine中的相关方法:

// HEADER
class SceneEngine
{
public:
    Camera& camera();
protected:
    Camera camera_;
}

// CPP
Camera& SceneEngine::camera() {
    return camera_;
}

由于 camera 对象是由 reference 编辑的 return,它 不能 为 null,因为引用始终指向实际存在的对象。

因此,如果您使用引用变量的地址,它就不能为空,因为它无论如何都指向一个有效的对象。

只使用 return 值而不进行任何空值检查。

PS. 如果函数 return 引用了一个不存在的对象(例如 null),那只是未定义的行为。

解法:

如果 camera() 需要在某个时候能够 return null,则将其 return 类型更改为 Camera* 以便能够 return空指针。

否则 — camera() 永远不会 returns null,即它总是 returns 对有效对象的引用 —,不需要您的 null 检查,这就是错误消息说.

看你的线路

if (&camera == NULL) return;

我们可以问:那句话什么时候会是真的?答案只有当 camera 绑定到取消引用的 NULL 指针时才会出现。

如果您有明显的错误代码案例,例如:

Camera* cameraPtr = NULL;
Camera& camera = *cameraPtr;

上述 if 语句的条件将计算为 true。如果 camera 可以绑定到这样一个解除引用的指针,那么 if 语句就有一定的价值。否则,它没有任何价值,编译器会警告您。

您问的是:

How else could I verify camera exists?

当一个函数returns被引用时,你必须假定函数returns是一个有效的Camera对象并继续使用它。删除 if 行。

由于语言标准定义在您拥有 NULL 引用的那一刻您有未定义的行为,因此允许编译器完全优化您的条件。因此,此代码无用。警告会通知您这件事。

要消除警告,您需要以确保首先不会生成 NULL 引用的方式编写代码。即,在您编写如下代码之前:

void bar(Camera& cam);
void foo(Camera* cam) {
    bar(*cam);
}

在将指针转换为引用之前需要检查指针:

void bar(Camera& cam);
void foo(Camera* cam) {
    if(cam) bar(*cam);    //this works as desired
}