new/delete 动态内存
new/delete 替代 malloc/free、new[] 数组分配、定位 new
new/delete 动态内存
C++ 用 new/delete 代替 malloc/free——不仅分配内存,还会调用构造函数和析构函数。
学完本章你将: 掌握 new/delete、new[]/delete[]、与 malloc 的差异。
new 和 delete 基础
cpp
#include <iostream>
int main() {
// 分配单个 int
int *p = new int(42); // 分配并初始化为 42
std::cout << *p << "\n"; // 42
delete p; // 释放
// 分配数组
int *arr = new int[5]{1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
std::cout << arr[i] << " ";
}
delete[] arr; // 数组用 delete[]
return 0;
}
new vs malloc
cpp
// C 方式(C++ 中不推荐)
int *c1 = (int *)malloc(sizeof(int));
free(c1);
// C++ 方式
int *c2 = new int;
delete c2;
| malloc/free | new/delete | |
|---|---|---|
| 构造/析构 | 不调用 | 会自动调用 |
| 返回值 | void*(需转换) | 正确类型的指针 |
| 失败 | 返回 NULL | 抛出 std::bad_alloc |
| 是操作符 | 函数 | 运算符(可重载) |
常见陷阱
cpp
// 1. 配对错误
int *p = new int[10];
// delete p; // ❌ 应该用 delete[]
delete[] p; // ✅
// 2. 忘记 delete → 内存泄漏
void leak() {
int *p = new int(42); // 忘记 delete
}
// 3. 重复 delete → 未定义行为
int *p = new int(42);
delete p;
// delete p; // ❌ 不能重复释放
p = nullptr; // 防御:释放后置 nullptr