2015-02-24 71 views
2

Xcode 6.3(测试版)给了我新的警告,任何建议如何解决这个问题?我不认为把这个检查完全删除是一个正确的答案,因为在某些情况下,“相机”已经为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_; 
} 
+4

如果你有一个'相机&',然后将相机存在或您有未定义的行为。没有但是。 – immibis 2015-02-24 06:22:31

+0

所以你建议摆脱警告,我应该删除检查和处理崩溃(相机为NULL时)以某种其他方式? – JOM 2015-02-24 06:26:49

+1

引用永远不应该是NULL,它们总是指向一个实际的对象,除非你像在R Sahu的回答中所证明的那样在地址0处强制一个对象存在的地方调用未定义的行为。这个断言不应该在那里,或者你应该使用指针来代替。 – Havenard 2015-02-24 06:28:24

回答

6

由于camera对象由参考返回,它不能是空的,因为引用总是指向一个实际存在的对象。

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

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

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

解决方案:

如果camera()需要能够在某些时候它的返回类型返回null,然后换Camera*能够返回一个空指针。

否则 - camera()永远不会返回空值,即它总是返回对有效对象的引用 - ,您不需要空的检查,这就是错误信息所说的。

+0

你是对的:要么我必须改变接口或确保相机永远存在。我会选择将Camera类型的返回类型更改为Camera *,因为其余代码似乎都期望这样。创建一个丢失的相机将是一个更冒险的任务。感谢几个解决方案的想法! – JOM 2015-02-24 07:24:20

1

看你行

if (&camera == NULL) return; 

我们可以问:这句话什么时候会是真的吗?答案只有当camera被绑定到一个取消引用的空指针时。

如果你有不好的代码就像一个明显的例子:

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

条件上述if语句将评估对true。如果camera可能绑定到这样一个取消引用的指针,则if语句有一定的价值。否则,它没有任何价值,编译器会警告你。

你问:

怎么我还能确认相机的存在呢?

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

+1

'camera&camera = * cameraPtr;'当'cameraPtr'为NULL时是未定义的行为。 – immibis 2015-02-24 06:23:06

+0

@immibis,我明白在明确定义的代码中就是这种情况。我提出了一个明显的错误代码案例。 – 2015-02-24 06:25:08

+0

好的,明白'Camera&camera = * cameraPtr;'可以让你的程序崩溃。 – immibis 2015-02-24 06:33:36

4

由于语言标准定义您在引用NULL时已具有未定义的行为,因此编译器可以完全优化您的条件。因此,此代码无用。警告会通知您这一点。

要使警告消失,您需要编写代码,以确保首先不会生成NULL引用。一,E,你这样写代码之前:

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 
}