new 和 delete

内容简介

newdelete 是 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;

最佳代码实践

  • newdeletenew[]delete[]
  • 释放后把裸指针设为 nullptr
  • C++ 中优先使用 std::vectorstd::stringstd::unique_ptrstd::shared_ptr,少写裸 new/delete
  • 需要动态数组时优先使用 std::vector
std::vector<int> arr(10);

错误用法

int* p = new int(10);
free(p);  // 错误:new 申请的内存不能 free
int* 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

相关:C语言MallocFree智能指针

学习路径