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

C++中对非数组变量使用delete[]是否合法可行?

对单个用new分配的对象使用delete[]是否可行?

这个问题确实是C++内存管理里一个容易踩的坑,先给你明确结论:这属于未定义行为,绝对不能这么写——哪怕你编译运行后没看到报错,也只是巧合而已。

为什么不能这么做?

  • 首先C++标准有明确规定:用new分配的单个对象必须用delete释放,用new[]分配的数组必须用delete[]释放,两者不能混用。
  • 对于int这种内置类型,你没看到报错是因为它们没有析构函数。delete[]此时可能只是单纯执行了内存释放操作,看起来没问题,但这完全依赖于编译器和内存分配器的实现,换个环境就可能出问题。
  • 如果是自定义类类型,问题会立刻暴露出来:delete[]会尝试遍历"数组"的每个元素调用析构函数,但实际上这里只有一个对象,它会越界访问内存区域,轻则触发崩溃,重则导致内存管理混乱,出现各种难以排查的诡异bug。
  • 另外,很多内存分配器会在分配的内存块头部记录额外信息(比如数组的元素数量),用错释放方式会破坏这些信息,后续的内存分配/释放操作都会受到影响。

举个直观的反例,用带析构函数的类测试:

#include <iostream>
using namespace std;

class TestClass {
public:
    ~TestClass() {
        cout << "TestClass destructor called" << endl;
    }
};

int main() {
    TestClass* ptr = new TestClass();
    delete[] ptr; // 错误的释放方式
    return 0;
}

运行这段代码,你会看到多次输出析构函数的调用——这明显不对,因为我们只创建了一个对象,却被当成数组来销毁了。

总结

严格遵守new与delete、new[]与delete[]的配对规则是C++内存管理的基础,不要因为某次运行没报错就心存侥幸,未定义行为的后果是不可预测的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:57:15