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

时间:2013-05-16 22:45:42

标签: c++ pointers

我试图理解C ++中的内存部分。我在使用下面的代码生成输出后尝试释放内存。

问题:

是否需要使用if-statement来释放内存?

代码:

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 * pc;         int * pi;

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

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


    delete pc;
    delete pi;

return 0;
}

3 个答案:

答案 0 :(得分:9)

  

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

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

int* p = nullptr;
delete p;

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

  

[...]的价值   提供给释放函数的第一个参数可以是空指针值; 如果是,如果解除分配   function是标准库中提供的函数,调用无效。 [...]

但是,

As suggested by chris in the comments考虑​​使用智能指针,而不是通过原始指针newdelete(或它们的数组对应物)执行手动内存管理。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:-1)

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

你想要的最后一件事是由于你的同事改变了代码的上半部分,因为释放了已经释放的指针而导致难以检测的错误

相关问题