You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用delete/delete[]前省略NULL指针检查是否安全?跨平台与C++标准版本

关于C++中delete/delete[]空指针检查的跨平台安全性问题

哈哈,这个问题我当年刚摸C的时候也纠结过,还踩过老编译器的坑!先给你拍板一个准信:**从C98标准开始,就明确规定了调用delete或delete[]操作NULL指针是完全安全的,不需要额外加检查**——不管是跨Windows还是Linux平台,只要你的编译器遵循标准,就不会出问题。

先讲标准依据

不管是C98、C11还是最新的C++23,标准里都明确写了:如果delete/delete[]的操作数是空指针值,那么整个表达式不会执行任何操作,既不会调用析构函数,也不会触发内存错误。换句话说,标准把空指针的情况当成了合法的“无操作”场景。

你当年遇到的g++问题是怎么回事?

你提到三四年前用MSVC v12(也就是VS2013)正常,但老g编译在Linux上抛空指针引用——这大概率是因为你当时用的g版本太老了,或者开启了某些非标准的编译选项。比如非常早期的g++(比如4.0之前的版本)可能存在不符合标准的实现bug,但从g4.0之后,就已经严格遵循标准处理空指针的delete操作了。现在主流的编译器(不管是g5+、MSVC2015+还是Clang)都不会再出现这种问题。

那要不要加NULL检查?

完全没必要!加了反而属于冗余代码:

  • 从标准合规性来说,跨平台只要用符合标准的编译器,就不会有问题;
  • 现代编译器会自动识别并优化掉if (ptr != nullptr) delete ptr;这种冗余检查,加不加对性能没影响,但少写一行代码更清爽。

举个简单的例子,下面的代码在任何符合标准的编译器上都是安全的:

// 完全安全的写法,不需要检查
int* p = nullptr;
delete p;

int* arr = nullptr;
delete[] arr;

额外提醒:别和C的free搞混

顺便提一句,C语言的free(NULL)也是安全的,但有些新手会把C的delete和C的free混淆,但本质上两者在空指针处理上是一致的——不过C里还是要严格区分delete/delete[]和free哦。

内容的提问来源于stack exchange,提问作者elklepo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:14:01