C++ new出来的内存,如何释放?
delete
delete[]
在C++中,当你使用new
操作符动态分配内存时,你需要使用delete
(对于单个对象)或delete[]
(对于对象数组)来释放这块内存。这是为了避免内存泄漏,即分配的内存没有被适当释放,导致程序占用的内存持续增加。
对于单个对象
如果你使用new
分配了一个单个对象的内存,你应该使用delete
来释放它。例如:
int* ptr = new int(10); // 分配一个int类型的内存,并初始化为10
// ... 使用ptr做一些操作
delete ptr; // 释放ptr所指向的内存
ptr = nullptr; // 设置为nullptr,避免成为悬空指针
对于对象数组
如果你使用new[]
分配了一个对象数组的内存,你应该使用delete[]
来释放它。例如:
int* arr = new int[10]; // 分配一个包含10个int的数组
// ... 使用arr做一些操作
delete[] arr; // 释放arr所指向的内存
arr = nullptr; // 设置为nullptr,避免成为悬空指针
注意事项
匹配使用:确保你使用
new
分配的内存用delete
释放,用new[]
分配的内存用delete[]
释放。不匹配使用会导致未定义行为,通常表现为程序崩溃或内存损坏。避免重复释放:一旦你释放了内存,就不要再访问那块内存了,否则会导致未定义行为。将指针设置为
nullptr
是一个好习惯,可以防止成为悬空指针。异常安全:在可能抛出异常的代码中,确保在抛出异常之前释放所有分配的内存。这通常通过RAII(Resource Acquisition Is Initialization)技术或使用智能指针(如
std::unique_ptr
和std::shared_ptr
)来自动管理内存来实现。智能指针:在C++11及以后的版本中,推荐使用智能指针(如
std::unique_ptr
和std::shared_ptr
)来自动管理动态分配的内存。这样可以减少内存泄漏的风险,并使代码更简洁、更安全。
例如,使用std::unique_ptr
管理单个对象的内存:
#include <memory>
std::unique_ptr<int> ptr(new int(10));
// ... 使用ptr做一些操作
// 不需要手动释放内存,unique_ptr的析构函数会自动处理