如何修复 "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
}
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
}