0

0

C++中如何手动管理堆内存 new和delete操作的正确用法

P粉602998670

P粉602998670

发布时间:2025-07-19 10:32:02

|

411人浏览过

|

来源于php中文网

原创

c++++中,手动管理堆内存需掌握new和delete的正确使用方法。1. new用于申请堆内存,形式包括单个对象t ptr = new t和数组对象t ptr = new t[count];2. delete用于释放内存,单个对象用delete ptr,数组对象必须用delete[] ptr,否则导致未定义行为;3. 内存泄漏常见于未及时释放或提前退出导致跳过delete,推荐使用智能指针自动管理资源;4. new/delete与malloc/free关键区别在于前者调用构造/析构函数,后者仅分配原始内存,且类型安全不同。正确配对使用new/delete并优先采用智能指针可显著减少内存管理错误。

C++中如何手动管理堆内存 new和delete操作的正确用法

在C++中,手动管理堆内存是开发者必须掌握的一项基本技能。newdelete 是用来动态分配和释放内存的关键字,用得不对就容易导致内存泄漏或程序崩溃。

C++中如何手动管理堆内存 new和delete操作的正确用法

下面几个方面是你最需要了解的:


1. new 的基本用法:怎么申请堆内存?

使用 new 可以在堆上为一个对象或一组对象分配内存空间。它的基本形式有两种:

立即学习C++免费学习笔记(深入)”;

C++中如何手动管理堆内存 new和delete操作的正确用法
  • 单个对象:T* ptr = new T;
  • 数组对象:T* ptr = new T[count];

比如:

int* p = new int;        // 分配一个int的空间
int* arr = new int[10];  // 分配10个int的空间

注意:

C++中如何手动管理堆内存 new和delete操作的正确用法
  • 如果内存不足,new 默认会抛出 std::bad_alloc 异常(除非你使用 nothrow 版本)。
  • 使用数组版本时记得加 [],否则 delete 的时候行为未定义。

2. delete 怎么正确释放内存?别搞混了单个和数组

new 对应,释放内存要用 deletedelete[],区别在于是否用于数组:

  • 单个对象:delete ptr;
  • 数组对象:delete[] ptr;

错误示例:

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

下载
int* arr = new int[10];
delete arr;  // ❌ 错误!应该用 delete[]

这会导致未定义行为,可能不会立即报错,但长期运行可能导致严重问题。

所以记住:

  • new T[] 分配的,必须用 delete[]
  • new T() 分配的,必须用 delete

3. 内存泄漏常见原因及避免方法

最常见的内存泄漏就是只分配不释放。比如:

void leak() {
    int* p = new int(42);
    // 没有 delete p;
}

每次调用这个函数都会“吞掉”一块内存。解决办法很简单:确保每块 new 出来的内存都有对应的 delete

还有些情况更隐蔽,例如:

  • 在循环或条件判断中提前 return,跳过了 delete
  • 抛异常前没释放资源

推荐做法:

  • 尽量使用智能指针(如 unique_ptrshared_ptr),它们能自动管理内存生命周期
  • 如果非要用裸指针,建议配合 RAII 手法封装资源管理逻辑

4. new/delete 和 malloc/free 的区别别搞混

虽然功能类似,但有几个关键区别要注意:

  • new / delete 是 C++ 运算符,会调用构造函数和析构函数;而 malloc / free 是库函数,只负责分配原始内存。
  • 不要混用:不要用 delete 释放 malloc 分配的内存,也不要用 free 去释放 new 得到的内存。
  • 类型安全:new 返回的是具体类型的指针,不需要强制转换;malloc 返回的是 void*,需要手动转换。

举个例子:

MyClass* obj = new MyClass();  // 构造函数会被调用
delete obj;                    // 析构函数会被调用

MyClass* obj2 = (MyClass*)malloc(sizeof(MyClass));  // 构造函数不会被调用
free(obj2);                                          // 析构函数也不会被调用

基本上就这些内容。手动管理堆内存看起来简单,但细节很容易忽略,尤其是在大型项目中。养成良好的习惯,比如配对使用 new/delete、优先使用智能指针,能大大减少 bug 的出现概率。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

225

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.11.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

173

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

92

2025.11.27

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

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

371

2023.07.18

堆和栈区别
堆和栈区别

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

563

2023.08.10

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

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

精品课程

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

共94课时 | 5.8万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.7万人学习

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

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