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

技术百科 穿越時空 发布时间:2025-12-29 浏览:
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和智能指针兜底。


# 自动化  # ai  # 有一个  # 为空  # 自定义  # 对象  #   # c++  # int  # 指针  # 构造函数  # red  # delete  # operator  # 类中  # 空指针  # 要严格  # color  # 少用  # ptr 


相关栏目: <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 AI推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 SEO优化<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 技术百科<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 谷歌推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 百度推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 网络营销<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 案例网站<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 精选文章<?muma echo $count; ?>

相关推荐

在线咨询

点击这里给我发消息QQ客服

在线咨询

免费通话

24h咨询:4006964355


如您有问题,可以咨询我们的24H咨询电话!

免费通话

微信扫一扫

微信联系
返回顶部