1. 内存管理基础概念
在C/C++开发中,内存管理是每个程序员必须掌握的硬核技能。与Java、Python等语言不同,C/C++将内存管理的控制权完全交给了开发者。这种设计带来了极高的灵活性,但也埋下了无数隐患。
内存管理本质上是对计算机内存资源的分配、使用和回收过程。在C++中,我们主要操作四种内存区域:
- 栈区(Stack):存储局部变量、函数参数等,由编译器自动管理
- 堆区(Heap):动态分配的内存区域,需要手动管理
- 全局/静态存储区:存储全局变量和静态变量
- 常量存储区:存储字符串常量等
关键理解:栈内存分配效率高但空间有限,堆内存空间大但管理复杂。new/delete操作的就是堆内存。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. new操作符深度解析
2.1 new的基本工作原理
当执行int* p = new int(10);时,背后发生了这些事:
- 调用operator new分配内存(底层通常是malloc)
- 在分配的内存上调用构造函数(对于类类型)
- 返回指向该内存的指针
与malloc的对比:
cpp复制// C风格
int* p1 = (int*)malloc(sizeof(int));
*p1 = 10;
// C++风格
int* p2 = new int(10);
实测差异:new会调用构造函数,malloc不会;new抛出bad_alloc异常,malloc返回NULL。
2.2 new的多种用法变体
- 普通new:
cpp复制MyClass* obj = new MyClass();
- 定位new(placement new):
cpp复制char buffer[sizeof(MyClass)];
MyClass* obj = new(buffer) MyClass(); // 在指定内存构造对象
- nothrow new:
cpp复制int* p = new(nothrow) int[100000000]; // 分配失败返回nullptr
if(!p) { /* 处理错误 */ }
- 数组new:
cpp复制MyClass* arr = new MyClass[10]; // 调用10次构造函数
``
