C++中new和delete如何正确使用?(内存管理)

new和delete必须严格成对且类型匹配:单个对象用new/delete,数组用new[]/delete[];混用导致未定义行为;推荐用unique_ptr/shared_ptr自动管理,避免内存泄漏与悬空指针。

new和delete必须成对使用,且类型要严格匹配。用new[]分配的数组必须用delete[]释放,否则行为未定义。

new和delete的基本配对规则

每次调用new,都应有且仅有一个对应的delete;每次new[],必须配delete[]。

  • new int申请单个对象 → 必须用delete ptr
  • new int[10]申请数组 → 必须用delete[] ptr
  • 混用(如new[]配delete)会导致内存泄漏、堆损坏或程序崩溃

避免裸指针管理,优先用智能指针

手动配对容易出错,C++11起推荐用std::unique_ptrstd::shared_ptr自动管理。

  • std::unique_ptr p(new int(42)); —— 析构时自动delete
  • std::unique_ptr arr(new int[100]); —— 自动调用delete[]
  • 不再需要显式调用delete,也无需担心忘记释放或重复释放

禁止对同一指针多次delete

delete后指针变成悬空指针,再次delete会引发未定义行为。

  • 释放后立即将指针置为nullptrdelete p; p = nullptr;
  • 用智能指针可彻底规避该问题(移动后原指针自动为空)
  • 注意:delete nullptr是安全的,但delete已释放过的非空指针不行

类中自定义new/delete需格外谨慎

重载类的operator new/delete时,必须确保与全局版本行为一致,并严格匹配数组/非数组版本。

  • 若重载了operator new[],必须同时提供operator delete[]
  • 异常安全要考虑:若构造函数抛异常,operator new分配的内存需由对应operator delete回收
  • 除非有明确性能或布局需求,否则不建议自行重载

基本上就这些。核心是配对、匹配、自动化。写C++时少用裸new/delete,多靠RAII和智能指针兜底。