在NULL指针上调用delete或delete []

elk*_*epo 1 c++ null memory-management

在调用deletedelete []之前总是省略NULL指针检查是否安全,特别是在编写跨平台代码段时?

我记得几年前(三四个)我编写的相同代码正在使用MS Windows(使用MSVCv12工具链编译)但是使用g ++编译的Linux版本(遗憾的是,我不记得g ++版本)抛出了NULL指针引用.我发现当时可能是编译器错误的信息.

我已经找到了这个SO线程,但在阅读之后我仍然不太确定它是否安全,如果是这样 - 从哪个版本的C++标准?

Che*_*Alf 6

是的,标准,因为C++ 98,保证deletedelete[]在nullpointer上没有效果.

C++98§5.3.5/ 2

"在任一替代方案中,如果操作数的值delete是空指针,则操作无效.

在第一个标准之前,当语言由Annotated Reference Manual定义时,也是如此.


关于

"使用g ++为Linux编译的版本(遗憾的是,我不记得g ++版本)是抛出NULL指针引用

没有具体的,优选完整的再现行为的例子,这是不可能的.它与删除nullpointer无关.

  • 在C++ 11及更高版本中有一个小细节:如果指针为空则调用解除分配函数是未指定的,因此如果用户重新执行解除分配函数,它可能会导致错误或UB,这将是不安全的如果指针是nullptr.但这是制作一个耙子然后踩到它的情况 (2认同)