zuojiankuohaophpc++np>在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并优先采用智能指针可显著减少内存管理错误。</p>

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

下面几个方面是你最需要了解的:
使用 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 的时候行为未定义。与 new 对应,释放内存要用 delete 或 delete[],区别在于是否用于数组:
delete ptr;
delete[] ptr;
错误示例:
int* arr = new int[10]; delete arr; // ❌ 错误!应该用 delete[]
这会导致未定义行为,可能不会立即报错,但长期运行可能导致严重问题。
所以记住:
new T[] 分配的,必须用 delete[]
new T() 分配的,必须用 delete
最常见的内存泄漏就是只分配不释放。比如:
void leak() {
int* p = new int(42);
// 没有 delete p;
}每次调用这个函数都会“吞掉”一块内存。解决办法很简单:确保每块 new 出来的内存都有对应的 delete。
还有些情况更隐蔽,例如:
推荐做法:
unique_ptr、shared_ptr),它们能自动管理内存生命周期虽然功能类似,但有几个关键区别要注意:
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 的出现概率。
以上就是C++中如何手动管理堆内存 new和delete操作的正确用法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号