c++:new关键字
目录
基本语法
使用举例
应用场景
使用 new 时的注意事项
基本语法
Type* ptr = new Type;
-
Type
是你要创建的类型(可以是基本类型、结构体、类等) -
new Type
表示在堆上创建一个Type
类型的对象 -
ptr
是一个指针,指向这个对象
使用举例
1. 基本类型
int* p = new int; // 不初始化
int* q = new int(42); // 初始化为 42
释放:
delete p;
delete q;
2. 类对象(调用构造函数)
class Person {
public:
std::string name;
Person(const std::string& n) : name(n) {}
};
Person* p = new Person("Alice");
释放:
delete p;
构造函数在 new
的时候调用,析构函数在 delete
的时候调用。
3. 动态数组
int* arr = new int[10]; // 分配10个int(未初始化)
int* arr2 = new int[10](); // 分配10个int,初始化为0
Person* people = new Person[3]; // 调用默认构造函数3次
释放数组:
delete[] arr;
delete[] arr2;
delete[] people;
❗️数组用 new[]
创建,一定要用 delete[]
释放。
应用场景
1. 动态生命周期管理
Person* createPerson() {
return new Person("Tom");
} // 返回了对象的地址,对象仍然存在
2. 创建大小在运行时才能确定的数组
int n;
std::cin >> n;
int* arr = new int[n]; // 普通数组不支持动态大小
3. 面向对象 + 多态时必须用指针(虚函数才生效)
Base* obj = new Derived();
4.调用构造函数
Person* p = new Person("Alice"); // 自动初始化
而 malloc()
(C语言方式)只分配内存,不会调用构造函数。
这也是为什么:C++ 推荐使用 new
而不是 malloc
,因为它支持对象语义(构造/析构)。
使用 new 时的注意事项
1.不要忘记释放内存,否则内存泄漏。
int* p = new int(5);
// ...
delete p; // 别忘了
2. 数组必须用 delete[] 释放,不要混用:
int* arr = new int[10];
delete arr; // ❌ 错误:只释放第一个元素,未调用其余析构函数
delete[] arr; // ✅ 正确
3.指针赋值要小心内存泄漏:
int* p = new int(10);
p = new int(20); // ❌ 之前的 10 没有 delete,泄漏了