C++堆内存管理:new与delete正确使用方法
<p>在C++中,手动管理堆内存需掌握new和delete的正确使用方法。1.new用于申请堆内存,形式包括单个对象Tptr=newT和数组对象Tptr=newT[count];2.delete用于释放内存,单个对象用deleteptr,数组对象必须用delete[]ptr,否则导致未定义行为;3.内存泄漏常见于未及时释放或提前退出导致跳过delete,推荐使用智能指针自动管理资源;4.new/delete与malloc/free关键区别在于前者调用构造/析构函数,后者仅分配原始内存,且类型安
在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 可以在堆上为一个对象或一组对象分配内存空间。它的基本形式有两种:

- 单个对象:
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;
错误示例:
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 的出现概率。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。















