1. C++动态内存管理基础
在C++编程中,内存管理是开发者必须掌握的核心技能之一。与许多现代语言不同,C++将内存管理的控制权完全交给了程序员,这种设计带来了极高的灵活性,同时也带来了相应的责任。new和delete运算符正是C++中进行动态内存分配与释放的关键工具。
动态内存分配允许程序在运行时(而非编译时)获取所需内存,这种特性在以下场景中尤为重要:
- 需要创建大小在编译时未知的数据结构
- 需要生命周期超出当前作用域的对象
- 需要特别大的内存块(栈空间通常有限)
1.1 new操作符的工作原理
当使用new操作符时,实际上发生了以下几个关键步骤:
- 内存分配:从堆(heap)中寻找足够大小的连续内存空间
- 对象构造:在分配的内存上调用对象的构造函数
- 返回指针:返回指向新创建对象的指针
一个简单的new表达式示例:
cpp复制int* ptr = new int(42); // 分配一个int并初始化为42
这里值得注意的是,new操作符实际上分为两个独立的部分:内存分配和对象构造。这种分离在placement new(定位new)中体现得尤为明显,我们将在后续章节详细讨论。
1.2 delete操作符的职责
与new相对应,delete操作符负责:
- 对象析构:调用对象的析构函数
- 内存释放:将内存归还给堆
对于上述例子,对应的delete操作为:
cpp复制delete ptr; // 释放ptr指向的内存
重要提示:对同一个指针多次调用delete是未定义行为,可能导致程序崩溃。安全的做法是在delete后立即将指针置为nullptr。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数组的动态分配与释放
动态数组是new和delete的另一个重要应用场景。与单个对象不同,数组的分配和释放有特殊的语法和注意事项。
2.1 数组的分配语法
数组的动态分配使用new[]操作符:
cpp复制int* arr = new int[10]; // 分配10个int的数组
C++11之后,我们还可以在分配时初始化动态数组:
cpp复制int* arr = new int[5]{1, 2, 3, 4, 5}; // 分配并初始化
