文章目录
- 一、C语言动态内存管理回顾
-
- [1. malloc/calloc/realloc/free基本用法](#1. malloc/calloc/realloc/free基本用法)
- [2. C语言内存管理的局限性](#2. C语言内存管理的局限性)
- 二、C++内存管理方式:new与delete
-
- [1. new/delete操作内置类型](#1. new/delete操作内置类型)
- [2. new/delete操作自定义类型](#2. new/delete操作自定义类型)
- 三、new/delete的底层机制
-
- [1. operator new与operator delete](#1. operator new与operator delete)
- [2. new/delete的实现原理](#2. new/delete的实现原理)
- 四、malloc/free与new/delete的对比
- 五、最佳实践与常见问题
-
- [1. 使用建议](#1. 使用建议)
- [2. 常见错误](#2. 常见错误)
- 六、总结
一、C语言动态内存管理回顾
1. malloc/calloc/realloc/free基本用法
C语言通过以下函数管理堆内存:
malloc:分配指定字节数的未初始化内存
calloc:分配并清零内存(适合数组)
realloc:调整已分配内存的大小
free:释放内存
示例代码:
cpp
void Test() {
int* p1 = (int*)malloc(sizeof(int)); // 分配单个int空间
int* p2 = (int*)calloc(4, sizeof(int)); // 分配4个int空间并清零
int* p3 = (int*)realloc(p2, 10 * sizeof(int)); // 扩展为10个int空间
free(p3); // 只需释放realloc后的指针
// free(p2); // 错误!p2已被realloc释放
}
2. C语言内存管理的局限性
不初始化对象:需手动初始化
类型不安全:返回void*需强制转换
无构造/析构:无法处理自定义类型的生命周期
二、C++内存管理方式:new与delete
1. new/delete操作内置类型
cpp
void Test() {
int* ptr1 = new int; // 分配未初始化的int空间
int* ptr2 = new int(10); // 初始化为10
int* ptr3 = new int[3]; // 分配3个int的数组
delete ptr1; // 释放单个元素
delete ptr2;
delete[] ptr3; // 释放数组(必须用delete[])
}
2. new/delete操作自定义类型
**核心优势:**自动调用构造函数和析构函数
cpp
class A {
public:
A(int a = 0) : _a(a) { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
private:
int _a;
};
int main() {
A* p1 = new A(1); // 调用构造函数
delete p1; // 调用析构函数
A* p2 = new A[3]; // 调用3次构造函数
delete[] p2; // 调用3次析构函数
return 0;
}
三、new/delete的底层机制
1. operator new与operator delete
operator new:全局函数,通过malloc申请空间,失败时抛出异常
operator delete:全局函数,通过free释放空间
伪代码解析:
cpp
void* operator new(size_t size) {
void* p = malloc(size);
if (p == nullptr) throw bad_alloc();
return p;
}
void operator delete(void* p) {
free(p);
}
2. new/delete的实现原理
new流程:
调用operator new分配内存
在分配的内存上调用构造函数
delete流程:
调用析构函数清理资源
调用operator delete释放内存
数组操作扩展:
new[]:调用operator new[],实际调用operator new分配连续空间
delete[]:调用每个元素的析构函数后释放内存
四、malloc/free与new/delete的对比

五、最佳实践与常见问题
1. 使用建议
匹配使用:new与delete配对,new[]与delete[]配对
优先选择new/delete:尤其处理自定义类型时
异常安全:使用try-catch处理内存分配失败
2. 常见错误
内存泄漏:未释放已分配内存
cpp
复制
int* p = new int;
// delete p; // 忘记释放!
类型不匹配:混用delete和delete[]
cpp
复制
int* arr = new int[5];
delete arr; // 错误!应用delete[]
悬垂指针:释放后继续访问指针
cpp
复制
int* p = new int(10);
delete p;
cout << *p; // 危险!p指向已释放内存
六、总结
C++内存管理优势:通过new/delete实现类型安全、自动构造/析构调用。
底层机制:依赖operator new/delete实现,本质仍基于malloc/free。
适用场景:优先使用new/delete,仅在需要与C代码交互时使用malloc/free。
掌握C++内存管理不仅能提升代码健壮性,还能有效避免内存泄漏等常见问题。理解其底层原理,将帮助开发者在复杂场景下做出更优设计决策。