在C++中,new 和 delete 操作符用于在堆(heap)上动态地分配和释放内存。这是管理内存的一种重要方式,特别是在需要创建可变数量或生命周期与程序执行流程不一致的对象时。
使用 new 进行动态内存分配
 
当你使用 new 操作符时,它会分配足够的内存来存储指定类型的对象,并返回指向该对象的指针。如果内存分配成功,则可以使用该指针来访问和操作该对象。如果内存分配失败(例如,由于内存不足),则 new 会抛出一个 std::bad_alloc 异常。
示例:
cpp复制代码
| int* p = new int; // 分配一个int大小的内存,并返回指向它的指针  | |
| *p = 42; // 使用指针来访问和修改该内存中的值 | 
对于类对象,你也可以使用 new 来分配内存并调用构造函数:
cpp复制代码
| class MyClass {  | |
| public:  | |
| MyClass(int value) : data(value) {}  | |
| // ... 其他成员和函数 ...  | |
| private:  | |
| int data;  | |
| };  | |
| MyClass* obj = new MyClass(10); // 分配内存并调用构造函数 | 
使用 delete 进行动态内存释放
 
当你使用 new 分配了内存后,应该在适当的时候使用 delete 操作符来释放它。delete 会调用对象的析构函数(如果有的话),并释放该对象占用的内存。
示例:
cpp复制代码
| int* p = new int;  | |
| // ... 使用p指向的内存 ...  | |
| delete p; // 释放内存,并调用int的析构函数(但int没有析构函数)  | |
| p = nullptr; // 将指针设置为nullptr,避免悬挂指针(dangling pointer)问题 | 
对于类对象,delete 会自动调用析构函数:
cpp复制代码
| MyClass* obj = new MyClass(10);  | |
| // ... 使用obj指向的对象 ...  | |
| delete obj; // 释放内存,并调用MyClass的析构函数  | |
| obj = nullptr; // 避免悬挂指针问题 | 
注意事项
- 避免悬挂指针:在使用 delete释放内存后,最好将指针设置为nullptr,以避免悬挂指针问题。悬挂指针是指已经被delete释放但仍然指向原内存地址的指针。
- 避免重复释放:不要对同一个指针多次使用 delete,这会导致未定义的行为。
- 注意内存泄漏:如果你忘记使用 delete来释放使用new分配的内存,就会发生内存泄漏。确保每个new都有对应的delete。
- 考虑使用智能指针:C++11引入了智能指针(如 std::unique_ptr和std::shared_ptr),它们可以自动管理内存的生命周期,从而减少内存泄漏的风险。