5

我试图理解 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(){ 字符 *pc; 整数 *pi;

    pc = new char('a');
    pi = new int(8);

    cout << *pc << endl;
    cout << *pi << endl;


    delete pc;
    delete pi;

return 0;
}
4

3 回答 3

9

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

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

int* p = nullptr;
delete p;

根据 C++11 标准的第 3.7.4/2 段:

[...] 提供给释放函数的第一个参数的值可能是空指针值;如果是这样,并且如果释放函数是标准库中提供的函数,则调用无效。[...]

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

于 2013-05-16T22:46:46.813 回答
3

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

一般来说,是否delete (T*)0;会为 type 调用释放函数是特定于实现的T。如果您的实现确实将空指针传递给释放函数,并且您的类型通过提供 member 覆盖了释放函数operator delete,或者您提供了替换 global ::operator delete,并且该自定义释放函数不能很好地处理空指针值,您可以有麻烦。

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

于 2013-05-16T22:54:03.043 回答
-1

不,不是,但这样做被认为是一种好习惯。在现实生活场景中,由于业务需求、错误等原因,您的代码经常更改,因此最好使用这种防御性编程策略。

您想要的最后一件事是由于释放已经释放的指针而出现难以检测的错误,因为您的同事更改了代码的上部

于 2013-05-16T22:49:28.773 回答