【发布时间】:2019-10-30 20:21:37
【问题描述】:
我使用gcc8编译这段代码:
#include <iostream>
class person
{
public:
virtual void setage()=0;
};
void test(person &object)
{
if (&object == NULL) {
std::cout << "NULL object1" << std::endl;
}
if (!(&object))
{
std::cout << "NULL object1" << std::endl;
}
}
int main()
{
person *object=NULL;
person &object1=*object;
test(object1);
}
然后,编译运行后出现两个警告:
$g++ -std=c++14 -pthread -fgnu-tm -O2 -Wall -Wextra -pedantic -pthread -pedantic-errors main.cpp -lm -latomic -lstdc++fs && ./a.out
main.cpp:在函数'void test(person&)'中:
main.cpp:11:17: 警告:编译器可以假设地址 'object' 永远不会为 NULL [-Waddress]
if (&object == NULL) { ^main.cpp:15:18: 警告:编译器可以假设地址 'object' 永远不会为 NULL [-Waddress]
if (!(&object)) ^main.cpp:15:5: 警告:非空参数“对象”与 NULL 相比 [-Wnonnull-compare]
if (!(&object)) ^~main.cpp:11:5: 警告:非空参数“对象”与 NULL 相比 [-Wnonnull-compare]
if (&object == NULL) { ^~
- 为什么函数
test中的object的地址即使传递了NULL引用值也不是NULL? - 看来函数
test中的引用object永远不能为NULL,所以我们可以删除代码if (&object == NULL){...}和if (&object == NULL) {...}来避免这两个警告,对吧?
感谢您的提示。
【问题讨论】:
-
&object永远不能是NULL。您正在检查将始终存在的对象的地址。编译器告诉您可以删除条件。主函数中的person &object1=*object;行尝试取消引用 NULL 指针,这将导致分段错误。 -
@MrPromethee 我用coliru编译运行,没有分段错误coliru.stacked-crooked.com/a/404da4c7eeedd154
-
你说得对,对不起,这实际上是未定义的行为。我的观点是你不应该取消对 NULL 指针的引用。
标签: c++ gcc-warning