首页 > 后端开发 > C++ > 正文

delete和delete[]区别 数组内存释放注意事项

P粉602998670
发布: 2025-08-17 19:09:02
原创
923人浏览过

必须使用delete释放new分配的单个对象,使用delete[]释放new[]分配的数组,二者不可混用,否则导致未定义行为;对于类对象数组,delete[]会正确调用每个元素的析构函数并释放内存,而delete仅调用首个元素析构,其余对象资源将泄漏;分配与释放方式必须匹配,即new配delete、new[]配delete[],同时避免重复释放、释放后应将指针置为nullptr,且不得对栈上数组或malloc分配的内存使用delete,推荐优先使用std::vector或std::unique_ptr等智能指针以避免手动管理内存带来的风险,正确匹配内存分配与释放方式是确保程序稳定运行的关键。

delete和delete[]区别 数组内存释放注意事项

在C++中,

delete
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
delete[]
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
都用于释放动态分配的内存,但它们的使用场景和行为有重要区别,尤其是在处理数组时。如果用错,可能导致未定义行为、内存泄漏或程序崩溃。


一、
delete
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
delete[]
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的区别

  • delete
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    :用于释放通过
    new
    登录后复制
    登录后复制
    分配的单个对象的内存。
  • delete[]
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    :用于释放通过
    new[]
    登录后复制
    登录后复制
    登录后复制
    分配的对象数组的内存。
int* p1 = new int;        // 分配单个int
delete p1;                // 正确:使用 delete

int* p2 = new int[10];    // 分配10个int的数组
delete[] p2;              // 正确:使用 delete[]
登录后复制

常见错误示例:

int* p = new int[10];
delete p;  // ❌ 错误!应该用 delete[],否则未定义行为
登录后复制
int* p = new int;
delete[] p;  // ❌ 错误!应该用 delete,使用 delete[] 同样是未定义行为
登录后复制
未定义行为(Undefined Behavior):程序可能看似正常运行,也可能崩溃或造成内存泄漏,具体表现取决于编译器和运行环境。

二、为什么必须匹配使用?

  1. 内存管理机制不同

    new[]
    登录后复制
    登录后复制
    登录后复制
    在分配数组时,除了分配足够的内存空间外,可能还会额外存储数组长度信息(用于析构对象),这个信息通常放在内存块的前面。
    delete[]
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    会读取这个信息,正确调用每个元素的析构函数(对类类型而言),并释放整个内存块。

  2. 对象析构问题
    如果数组元素是类对象(如

    std::string
    登录后复制
    、自定义类等),
    delete[]
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    会逐个调用每个元素的析构函数;而
    delete
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    只会调用第一个元素的析构函数,其余对象不会被正确清理。

class MyClass {
public:
    ~MyClass() { cout << "析构函数调用\n"; }
};

MyClass* obj = new MyClass[3];
delete[] obj;  // ✅ 正确:3个对象都会调用析构函数

// 如果写成:
// delete obj;  // ❌ 只有第一个对象析构,其余两个资源可能泄漏
登录后复制

三、数组内存释放注意事项

  • 必须用

    new[]
    登录后复制
    登录后复制
    登录后复制
    delete[]
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    new
    登录后复制
    登录后复制
    delete
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    这是基本原则,不能混用。

  • 不要重复释放同一块内存
    多次调用

    delete
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    delete[]
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    同一个指针会导致未定义行为。

    int* p = new int[5];
    delete[] p;
    delete[] p;  // ❌ 双重释放,危险!
    登录后复制
  • 释放后将指针置为

    nullptr
    登录后复制

    避免悬空指针(dangling pointer),减少后续误用风险。

    delete[] p;
    p = nullptr;
    登录后复制
  • 不要对非动态内存使用

    delete
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    栈上分配的数组不能用
    delete[]
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    释放。

    int arr[10];
    delete[] arr;  // ❌ 错误!arr 不是 new[] 分配的
    登录后复制
  • 优先使用智能指针或标准容器
    避免手动管理内存是更安全的做法。

    • 使用
      std::vector
      登录后复制
      替代动态数组
    • 使用
      std::unique_ptr<T[]>
      登录后复制
      管理数组
    std::unique_ptr<int[]> ptr = std::make_unique<int[]>(10);
    // 自动调用 delete[],无需手动释放
    登录后复制

四、总结

操作 应该使用的释放方式
@@######@@ @@######@@
@@######@@ @@######@@
@@######@@ @@######@@(不要用 @@######@@)
栈上数组 不需要 @@######@@

关键点:分配方式决定释放方式。匹配使用才能确保内存和对象生命周期正确管理。

基本上就这些。虽然规则简单,但一旦出错很难调试,所以养成良好习惯很重要。

new T
登录后复制
delete
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
new T[]
登录后复制
delete[]
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
malloc
登录后复制
free
登录后复制
delete
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
delete
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

以上就是delete和delete[]区别 数组内存释放注意事项的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号