1. 内存管理基础概念
在C++编程中,内存管理是每个开发者必须掌握的核心技能。记得我刚入行时,第一次遇到内存泄漏问题调试了整整三天,那种痛苦至今记忆犹新。内存管理本质上就是程序运行时对计算机内存资源的分配和释放过程,就像在图书馆借书和还书一样——借了不还会导致资源枯竭,这就是所谓的内存泄漏。
C++与其他现代语言最大的不同在于它把内存控制的权力完全交给了程序员。这种设计带来了极高的灵活性,但也伴随着巨大的责任。在Java或Python中,垃圾回收机制会自动处理不再使用的内存,而C++程序员必须手动管理每一块分配的内存。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. new操作符深度解析
2.1 new的基本用法
new操作符是C++中动态分配内存的主要方式。它的基本语法看起来很简单:
cpp复制int *p = new int; // 分配一个int大小的内存
*p = 42; // 在分配的内存中存储值
但在这简单的语句背后,编译器实际上做了三件事:
- 调用
operator new分配原始内存 - 在分配的内存上构造对象(调用构造函数)
- 返回指向新创建对象的指针
2.2 new的多种形式
实际开发中,我们会遇到几种不同的new用法:
cpp复制// 单个对象分配
MyClass *obj = new MyClass();
// 数组分配
MyClass *arr = new MyClass[10];
// 定位new(placement new)
void *memory = malloc(sizeof(MyClass));
MyClass *obj = new(memory) MyClass();
定位new特别值得注意,它允许我们在已分配的内存上构造对象,这在实现内存池时非常有用。
2.3 new的底层机制
当调用new时,如果内存不足会发生什么?默认情况下会抛出std::bad_alloc异常。但我们可以通过nothrow版本来改变这一行为:
cpp复制int *p = new(std::nothrow) int[100000000];
if (!p) {
// 处理分配失败
}
在底层,operator new最终会调用`m
