讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

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

云浩姑娘_3813

云浩姑娘_3813

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

|

1083人浏览过

|

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

    C++14
    C++14

    C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

    下载
  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

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

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

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

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

7499

2023.08.02

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

399

2026.04.23

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

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

6987

2023.07.18

堆和栈区别
堆和栈区别

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

2868

2023.08.10

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

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

179

2025.11.16

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

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

3571

2023.11.13

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

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

1065

2023.12.29

undefined是什么
undefined是什么

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

12385

2023.07.31

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn