【C/C++】new关键字解析
📘 C++ 中 new
关键字详解笔记
🔹 什么是 new
?
new
是 C++ 中用于动态内存分配的关键字,它在堆内存中为对象或变量分配空间,并返回对应类型的指针。
与 C 语言中的 malloc
相比,new
更安全、更方便,并支持调用构造函数。
✅ 基本语法
int* p = new int; // 分配一个 int,未初始化
int* q = new int(42); // 分配一个 int,并初始化为 42
double* arr = new double[5]; // 分配一个 double 类型的数组,长度为 5
📌 说明:初始化为 42 ≠ 分配 42 字节
int* q = new int(42);
这句代码的含义是:
- 在堆上分配一个
int
类型大小的内存(通常为 4 字节) - 并将该
int
类型的值初始化为42
- 返回这块内存的地址,并由指针
q
接收
它并不是“分配了 42 字节的空间”,只是“将分配的 int
类型变量初始化为值 42”。
🧱 使用示例
🌟 分配单个变量
int* a = new int; // 分配内存但未初始化
*a = 10; // 使用分配的空间
🌟 分配并初始化
int* b = new int(100); // 分配并初始化为 100
🌟 分配数组
int* arr = new int[5];
for (int i = 0; i < 5; i++) {arr[i] = i * i;
}
🌟 类对象的动态创建
class Person {
public:Person() { std::cout << "Person 构造函数\n"; }~Person() { std::cout << "Person 析构函数\n"; }
};Person* p = new Person(); // 调用构造函数
// 使用对象...
delete p; // 调用析构函数,释放内存
🧼 配套释放:delete
和 delete[]
delete a; // 释放单个变量
delete b;
delete[] arr; // 释放数组,必须用 delete[]
❗ 错误用法:数组用
delete
会导致内存泄漏或未定义行为。
🧠 new
vs malloc
对比
特性 | new | malloc |
---|---|---|
所属语言 | C++ | C / C++ |
类型安全 | ✅ 是 | ❌ 否(需强转) |
返回类型 | 指定类型指针 | void* |
是否初始化 | ✅ 可以初始化 | ❌ 不初始化 |
调用构造函数 | ✅ 是 | ❌ 否 |
配套释放方法 | delete / delete[] | free() |
示例对比:
// C++ 写法
int* a = new int(10); // 初始化并安全分配// C 写法
int* b = (int*)malloc(sizeof(int));
*b = 10;
🔍 小结
new
关键字用于堆上分配内存,是 C++ 的推荐做法。new
自动计算类型大小、调用构造函数,并返回强类型指针。- 使用
new
后必须搭配delete
,否则会产生内存泄漏。 - 对于数组使用
new[]
,释放时对应使用delete[]
。 - 与
malloc
相比,new
更安全、更现代、更适合 C++ 风格。
💡 如果你使用的是现代 C++(C++11 及以上),推荐使用智能指针如
std::unique_ptr
、std::shared_ptr
替代new
。
📎 拓展阅读
- 智能指针与
new
的关系 placement new
的特殊用法- 构造函数与析构函数执行顺序