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

14K*_*14K 5 c++ pointers

我试图理解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;
}
Run Code Online (Sandbox Code Playgroud)

我可以这样做吗?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;
}
Run Code Online (Sandbox Code Playgroud)

And*_*owl 9

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

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

int* p = nullptr;
delete p;
Run Code Online (Sandbox Code Playgroud)

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

[...]提供给解除分配函数的第一个参数的值可以是空指针值; 如果是这样,并且如果解除分配功能是标准库中提供的功能,则该调用无效.[...]

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

  • 此外,`std :: nullptr_t`不是类类型,因此上下文隐式转换不适用.(即使它确实如此,它也会模棱两可) (2认同)
  • @BenVoigt:嗯,对:)谢谢你,今天学到了一些东西 (2认同)

Ben*_*igt 3

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

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

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