如何修复“引用无法绑定到解除引用的空指针”警告

时间:2015-02-24 06:14:23

标签: c++ reference xcode6

Xcode 6.3(beta)给了我新的警告,任何建议如何解决问题?我不认为完全删除检查是无效的,因为在某些情况下,“相机”已经为NULL并且在其他地方导致崩溃。

  

引用不能绑定到定义良好的C ++代码中的解除引用的空指针;可以假设比较总是评估为假

这是代码。我怎么能验证相机存在?

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_;
}

3 个答案:

答案 0 :(得分:6)

由于引用返回camera对象,因此不能为空,因为引用始终指向实际的现有对象。

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

只需使用返回值而不进行任何空检查。

PS。如果函数返回对不存在对象的引用(例如null),那就是未定义的行为。

<强>解决方案:

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

否则 - camera()永远不会返回null,即它总是返回对有效对象的引用 - 不需要进行空检查,而且这是错误信息所说的内容。

答案 1 :(得分:4)

由于语言标准定义了在您具有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
}

答案 2 :(得分:1)

看着你的行

if (&camera == NULL) return;
我们可以问:这句话什么时候会成立?答案是仅当camera绑定到取消引用的NULL指针时。

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

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

上述if语句的条件将评估为true。如果camera可以绑定到这样的解除引用指针,则if语句具有一些值。否则,它没有任何值,编译器会警告你。

你问:

  

我怎么能验证相机存在?

当函数返回引用时,您必须假定该函数返回有效的Camera对象并继续使用它。删除if行。