new 和 delete
内容简介
new 和 delete 是 C++ 手动管理堆内存的运算符。new 会分配内存并调用构造函数,delete 会调用析构函数并释放内存。
用法
单个对象
int* p = new int(10);
std::cout << *p << std::endl;
delete p;
p = nullptr;动态数组
int* arr = new int[10]{};
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
delete[] arr;
arr = nullptr;对象构造和析构
class Person {
public:
Person() { std::cout << "construct\n"; }
~Person() { std::cout << "destroy\n"; }
};
Person* p = new Person();
delete p;最佳代码实践
new配delete,new[]配delete[]。- 释放后把裸指针设为
nullptr。 - C++ 中优先使用
std::vector、std::string、std::unique_ptr、std::shared_ptr,少写裸new/delete。 - 需要动态数组时优先使用
std::vector。
std::vector<int> arr(10);错误用法
int* p = new int(10);
free(p); // 错误:new 申请的内存不能 freeint* arr = new int[10];
delete arr; // 错误:数组必须 delete[]int* p = new int(10);
delete p;
std::cout << *p << std::endl; // 错误:释放后继续使用注意事项
malloc/free是 C 标准库函数,不会调用构造函数和析构函数。new失败默认抛出std::bad_alloc,不是返回NULL。- 现代 C++ 的核心不是“多用 new”,而是尽量让资源由对象自动释放,也就是 RAII。