如何修复"reference cannot be bound to dereferenced null pointer"警告
How to fix "reference cannot be bound to dereferenced null pointer" warning
Xcode 6.3(测试版(给了我新的警告,有什么建议可以解决问题吗?我不认为将支票完全删除为无效是一个正确的答案,因为在某些情况下,"相机"已经为空,后来在其他地方导致崩溃。
在定义良好的 C++ 代码中,引用不能绑定到取消引用的空指针;可以假定比较总是计算结果为 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
对象是通过引用返回的,因此它不能为 null,因为引用始终指向实际的现有对象。
因此,如果您获取引用变量的地址,它不能为 null,因为它无论如何都指向一个有效的对象。
只需使用返回值而不进行任何空检查。
如果函数返回对不存在对象的引用(例如 null(,那只是未定义的行为。
溶液:
如果camera()
需要能够在某个时间点返回 null,则将其返回类型更改为 Camera*
以便能够返回 null 指针。
否则 — camera()
从不返回 null,即它总是返回对有效对象的引用 — 不需要您的 null 检查,这就是错误消息所说的。
由于语言标准定义了您在拥有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
}
看你的行
if (&camera == NULL) return;
我们可以问:这种说法什么时候会是正确的?答案是仅当camera
绑定到取消引用的 NULL 指针时。
如果你有一个明显的错误代码案例,例如:
Camera* cameraPtr = NULL;
Camera& camera = *cameraPtr;
上述if
语句的条件将计算为 true
。如果camera
可以绑定到此类取消引用的指针,则 if
语句具有一定的价值。否则,它没有值,编译器会警告您。
你问:
我还能如何验证相机是否存在?
当函数返回引用时,您必须假定该函数返回有效的Camera
对象并继续使用它。删除if
行。
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在 c++ 中'NULL'字符串
- c++使用foreach使数组为null
- 当使用通配符和null指针调用函数时,对输出的说明
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何在映射中返回null
- 为什么返回 NULL 不会破坏函数?
- 构造函数中的 QQuickItem 父项 null
- 检查字符串是否"null" C++
- fopen 在 gdb 中返回 NULL
- what(): basic_string::_M_construct null not valid
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 为什么要从main()返回NULL?
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 是否有通用方法可以找到任何以 null 结尾的字符串的长度?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- 使用 curl_easy_cleanup(curl) 时收到未经处理的 NULL 异常
- 如何修复"reference cannot be bound to dereferenced null pointer"警告