gpt4 book ai didi

c++ - 如何修复警告 "the compiler can assume that the address of ' 对象“永远不会为 NULL”

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:12:27 25 4
gpt4 key购买 nike

我使用 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: In function 'void test(person&)':

main.cpp:11:17: warning: the compiler can assume that the address of 'object' will never be NULL [-Waddress]

 if (&object == NULL) {

^

main.cpp:15:18: warning: the compiler can assume that the address of 'object' will never be NULL [-Waddress]

 if (!(&object))

^

main.cpp:15:5: warning: nonnull argument 'object' compared to NULL [-Wnonnull-compare]

 if (!(&object))

^~

main.cpp:11:5: warning: nonnull argument 'object' compared to NULL [-Wnonnull-compare]

 if (&object == NULL) {

^~
  1. 为什么函数testobject的地址不是NULL,甚至传递一个NULL引用值给它?
  2. 似乎函数test 中的引用object 永远不能为NULL,所以我们可以删除代码if (&object == NULL){.. .}if (&object == NULL) {...} 来避免这两个警告,对吧?

感谢提示。

最佳答案

在结构良好的 C++ 程序中,引用永远不会为 null。初始化引用的唯一有效方法是将其绑定(bind)到有效对象。可能发生“空引用”的唯一方法是像您一样取消引用空指针。但是,即使在您检查 &object == NULL 之前,您的程序的行为也是未定义的。该错误存在于传递“空引用”的代码中,必须在此处修复。

因此编译器警告您添加了一个多余的检查,这对您几乎没有任何保护作用,因为需要修复的损坏代码在您的函数之外。

关于c++ - 如何修复警告 "the compiler can assume that the address of ' 对象“永远不会为 NULL”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56627939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com