0

0

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

P粉602998670

P粉602998670

发布时间:2025-08-17 19:09:02

|

1043人浏览过

|

来源于php中文网

原创

必须使用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[]
    会读取这个信息,正确调用每个元素的析构函数(对类类型而言),并释放整个内存块。

    PodLM
    PodLM

    PodLM是一款强大的AI播客生成工具

    下载
  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
      管理数组
    std::unique_ptr ptr = std::make_unique(10);
    // 自动调用 delete[],无需手动释放

四、总结

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

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

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

new T
delete
new T[]
delete[]
malloc
free
delete
delete

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

567

2023.08.10

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

22

2025.11.16

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.12.29

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

4309

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

2917

2024.08.14

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

59

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.3万人学习

C 教程
C 教程

共75课时 | 3.9万人学习

C++教程
C++教程

共115课时 | 11.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号