You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在C++中无论指针指向单个对象还是数组,都用delete[]删除是否安全?

在C++中用delete[]处理任意指针是否安全?

嘿,这个问题问到点子上了——不少刚摸C内存管理的开发者都会有这种“偷懒”的想法,但结论很明确:**绝对不安全,这是C标准定义的未定义行为**,千万别这么干。

为啥不能这么做?核心原因在于new/deletenew[]/delete[]的底层逻辑完全不同:

  • 内存布局差异:很多编译器在分配数组时,会在返回的指针前面额外存储一个整数,用来记录数组的元素个数。当你调用delete[]时,它会先读取这个计数,然后依次调用每个元素的析构函数,最后释放整块内存。但如果是单个对象(用new分配的),内存里根本没有这个计数,delete[]会去读取非法的内存地址,直接触发内存访问错误或者更诡异的崩溃。
  • 析构函数调用错误:对于有自定义析构函数的类对象,delete[]会根据前面的计数多次调用析构函数。但单个对象只需要调用一次,这就会导致析构函数被重复调用到不存在的对象上,轻则内存泄漏,重则程序直接崩溃。哪怕是intchar这种内置类型(它们的析构是空操作),标准依然禁止这种写法——谁知道不同编译器会不会有特殊的内存管理逻辑?

举个直观的错误示例:

class MyClass {
public:
    ~MyClass() { /* 自定义析构逻辑,比如释放资源 */ }
};

// 错误:单个对象用delete[]释放
MyClass* singleObj = new MyClass;
delete[] singleObj; // 未定义行为!大概率会崩

正确的做法必须严格配对:

  • new分配的单个对象 → 用delete释放
  • new[]分配的数组 → 用delete[]释放

别抱着“我测试过没问题”的侥幸心理——未定义行为的表现是不可预测的,换个编译器、换个平台甚至只是改个编译选项,程序就可能突然炸锅。

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

火山引擎 最新活动