C++中动态内存通过new/delete和malloc/free实现,new分配内存并调用构造函数,delete释放内存并调用析构函数,适用于对象管理;可分配单变量如int p = new int(10),或数组如int arr = new int[5],需配对使用delete[]防止内存泄漏。

在C++中,动态分配内存是程序运行时根据需要申请和释放内存空间的重要手段。它允许我们灵活地管理资源,特别是在处理未知大小的数据结构(如数组、对象)时非常有用。C++提供了多种方式来实现动态内存管理,主要通过new和delete操作符以及底层的malloc、free函数(继承自C语言)来完成。
使用 new 和 delete 进行动态内存分配
new 和 delete 是C++中用于动态内存管理的核心操作符,它们不仅分配或释放内存,还会自动调用构造函数和析构函数,适用于类对象的管理。
1. 动态分配单个变量:
你可以使用 new 来为一个变量分配内存,并返回指向该内存的指针。
立即学习“C++免费学习笔记(深入)”;
例如:
int* p = new int; // 分配一个int类型的内存 *p = 10; // 给这块内存赋值 delete p; // 释放内存 p = nullptr; // 避免悬空指针
2. 初始化动态变量:
可以在分配的同时进行初始化:
double* pd = new double(3.14);
3. 动态分配数组:
使用 new[] 可以分配数组空间。
int n = 5;
int* arr = new int[n]; // 分配长度为n的整型数组
for(int i = 0; i < n; ++i)
arr[i] = i * 2;
delete[] arr; // 注意:必须使用 delete[]
arr = nullptr;
4. 对象的动态创建与销毁:
对于类对象,new 会调用构造函数,delete 会调用析构函数。
class MyClass {
public:
MyClass() { cout << "构造函数被调用\n"; }
~MyClass() { cout << "析构函数被调用\n"; }
};
MyClass* obj = new MyClass(); // 调用构造函数
delete obj; // 调用析构函数
使用 malloc/free(不推荐用于C++对象)
C++兼容C语言的 malloc 和 free 函数,但它们不会调用构造函数或析构函数,因此不适合用于类对象。
#includeint p = (int)malloc(sizeof(int)); // 手动计算大小,返回voidp = 20; free(p); // 仅释放内存
这种方式缺乏类型安全且不支持构造/析构逻辑,在现代C++中应避免使用,除非与C库交互。
常见问题与注意事项
-
内存泄漏: 忘记调用
delete或delete[]会导致内存无法回收。 - 重复释放: 多次释放同一块内存会引起未定义行为。
-
匹配使用:
new对应delete,new[]对应delete[],混用会导致错误。 - 悬空指针: 释放后未置空,可能导致非法访问。
现代C++中的替代方案:智能指针
为了避免手动管理内存带来的风险,C++11引入了智能指针,能自动管理生命周期。
-
std::unique_ptr:独占所有权,离开作用域自动释放。 -
std::shared_ptr:共享所有权,引用计数为零时释放。 -
std::weak_ptr:配合 shared_ptr 使用,防止循环引用。
示例:
#includestd::unique_ptr ptr = std::make_unique (42); // 自动释放,无需手动 delete
推荐在新项目中优先使用智能指针代替原始指针和手动内存管理。
基本上就这些。掌握 new/delete 是理解C++内存机制的基础,但在实际开发中更应依赖RAII和智能指针来写出安全、可靠的代码。











