在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 是用来动态分配和释放内存的关键字,用得不对就容易导致内存泄漏或程序崩溃。

下面几个方面是你最需要了解的:
1. new 的基本用法:怎么申请堆内存?
使用 new 可以在堆上为一个对象或一组对象分配内存空间。它的基本形式有两种:
立即学习“C++免费学习笔记(深入)”;

- 单个对象:
T* ptr = new T; - 数组对象:
T* ptr = new T[count];
比如:
int* p = new int; // 分配一个int的空间 int* arr = new int[10]; // 分配10个int的空间
注意:

- 如果内存不足,
new默认会抛出std::bad_alloc异常(除非你使用nothrow版本)。 - 使用数组版本时记得加
[],否则 delete 的时候行为未定义。
2. delete 怎么正确释放内存?别搞混了单个和数组
与 new 对应,释放内存要用 delete 或 delete[],区别在于是否用于数组:
- 单个对象:
delete ptr; - 数组对象:
delete[] ptr;
错误示例:
动态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_ptr、shared_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 的出现概率。









