有必要在释放内存时使用IF语句吗?

Is it necessary to use IF statement when releasing memory?

本文关键字:IF 语句 释放 内存      更新时间:2023-10-16

我正在努力理解c++中的内存部分。我试图通过使用下面的代码生成输出后释放内存。

问题:

有必要使用if语句释放内存吗?

代码:

int main(){
    char *pc;
    int *pi;
    pc = new char('a');
    pi = new int(8);
    cout << *pc << endl;
    cout << *pi << endl;
    //What's the purpose for doing if(pc) and if (pi) below?
    if(pc){
        delete pc;
    }
    if(pi){
        delete pi;
    }
return 0;
}

我可以这样做吗?int main () {char *电脑;int *π;

    pc = new char('a');
    pi = new int(8);
    cout << *pc << endl;
    cout << *pi << endl;

    delete pc;
    delete pi;
return 0;
}

释放内存时是否需要使用IF语句?

不,它不是(只要您没有覆盖全局operator delete)。这很好,不会做任何事情:

int* p = nullptr;
delete p;

c++ 11标准第3.7.4/2段:

[…的值提供给释放函数的第一个参数可以是空指针值;,如果是,如果释放函数是标准库中提供的函数,则调用不起作用。[…]

正如chris在评论中建议的那样,考虑使用智能指针,而不是通过原始指针、newdelete(或它们的数组对应物)执行手动内存管理。

在您的特定代码中,不需要null检查。

一般来说,delete (T*)0;是否调用类型T的释放函数是具体实现的。如果你的实现将空指针传递给释放函数,或者你的类型通过提供成员operator delete覆盖了释放函数,或者你提供了一个替代的全局::operator delete,而那个自定义的释放函数不能很好地处理空指针值,你可能会遇到麻烦。

标准不要求自定义operator delete在传递空指针时不做任何事情。它不应该失败,但它可能会写令人讨厌的日志消息或告诉你的老板有人没有遵循编码标准,例如

不,它不是,但它被认为是一个很好的做法。在现实生活中,由于业务需求、bug等原因,您的代码经常发生变化,因此最好使用这种防御性编程策略。

您最不想要的是由于您的同事更改了代码的上部

而释放已经释放的指针而导致难以检测的错误。