当前位置: 首页 > news >正文

东莞住房建设网站的网全球搜索网站排名

东莞住房建设网站的网,全球搜索网站排名,帝国cms 网站地图插件,阿里云搜索引擎入口目录 一、循环引用#xff08;最常见场景#xff09; 示例代码 内存泄漏原因 二、共享指针管理的对象包含自身的 shared_ptr 示例代码 内存泄漏#xff08;或双重释放#xff09;原因 三、解决方案 1. 循环引用#xff1a;使用 std::weak_ptr 2. 对象获取自身的 …目录 一、循环引用最常见场景 示例代码 内存泄漏原因 二、共享指针管理的对象包含自身的 shared_ptr 示例代码 内存泄漏或双重释放原因 三、解决方案 1. 循环引用使用 std::weak_ptr 2. 对象获取自身的 shared_ptr继承 std::enable_shared_from_this 四、其他潜在风险 1. 混合使用原始指针和 shared_ptr 2. 数组管理 总结 std::shared_ptr 是 C 中用于管理动态内存的智能指针通过引用计数机制自动释放对象。但在某些场景下它仍可能导致内存泄漏。以下通过具体例子说明 一、循环引用最常见场景 示例代码 #include iostream #include memoryclass B; // 前向声明class A { public:std::shared_ptrB b_ptr;~A() { std::cout A destroyed std::endl; } };class B { public:std::shared_ptrA a_ptr;~B() { std::cout B destroyed std::endl; } };int main() {auto a std::make_sharedA(); // a的引用计数为1auto b std::make_sharedB(); // b的引用计数为1a-b_ptr b; // b的引用计数变为2b-a_ptr a; // a的引用计数变为2// main函数结束时// a和b的引用计数减1但仍为1互相持有对方的shared_ptr// 导致两者的析构函数都不会被调用内存泄漏return 0; }内存泄漏原因 a 和 b 互相持有对方的 shared_ptr形成循环引用。当 main 函数结束时a 和 b 的局部变量被销毁引用计数减 1但仍为 1因为对方的成员变量还持有自己的指针。引用计数永远无法降为 0导致析构函数不会被调用内存无法释放。 二、共享指针管理的对象包含自身的 shared_ptr 示例代码 #include iostream #include memoryclass Bad { public:std::shared_ptrBad getSelf() {return std::shared_ptrBad(this); // 危险}~Bad() { std::cout Bad destroyed std::endl; } };int main() {auto b1 std::make_sharedBad();auto b2 b1-getSelf(); // 创建了第二个独立的shared_ptr管理同一对象// b1和b2的引用计数均为1// main函数结束时b1和b2分别析构导致对象被delete两次双重释放return 0; }内存泄漏或双重释放原因 getSelf() 方法中使用 this 指针创建了一个新的 shared_ptr与原 shared_ptr 无关。同一对象被两个独立的 shared_ptr 管理引用计数各自为 1。当两个 shared_ptr 析构时对象被重复释放导致未定义行为通常是程序崩溃。 三、解决方案 1. 循环引用使用 std::weak_ptr std::weak_ptr 是一种弱引用不增加引用计数用于打破循环 class A { public:std::weak_ptrB b_ptr; // 改为weak_ptr~A() { std::cout A destroyed std::endl; } };class B { public:std::weak_ptrA a_ptr; // 改为weak_ptr~B() { std::cout B destroyed std::endl; } };weak_ptr 不会增加引用计数当 a 和 b 局部变量销毁时引用计数降为 0对象正常释放。 2. 对象获取自身的 shared_ptr继承 std::enable_shared_from_this #include memoryclass Good : public std::enable_shared_from_thisGood { public:std::shared_ptrGood getSelf() {return shared_from_this(); // 安全}~Good() { std::cout Good destroyed std::endl; } };shared_from_this() 返回一个与已有 shared_ptr 共享引用计数的新指针避免双重释放。 四、其他潜在风险 1. 混合使用原始指针和 shared_ptr int* raw new int(42); std::shared_ptrint ptr1(raw); std::shared_ptrint ptr2(raw); // 错误两个独立的shared_ptr管理同一内存同一原始指针被多个 shared_ptr 独立管理导致双重释放。 2. 数组管理 std::shared_ptr 默认使用 delete 释放对象若管理数组需自定义删除器 std::shared_ptrint[] arr(new int[10]); // 错误默认使用delete而非delete[] std::shared_ptrint arr(new int[10], [](int* p) { delete[] p; }); // 正确总结 std::shared_ptr 内存泄漏的核心原因是引用计数无法降为 0常见于循环引用和错误的指针管理。使用 std::weak_ptr 和 std::enable_shared_from_this 可有效避免这些问题。在实际开发中应尽量避免手动管理原始指针确保所有动态内存都由智能指针统一管理。
http://www.hyszgw.com/news/93798.html

相关文章:

  • 网站的分析与设计排版设计说明
  • 网站优化是往新闻中心发新闻吗校园二手网站开发与设计任务书
  • 网站修改解析怎么做wordpress 406
  • 网站速度优化 js加载做精细化工网站
  • 网站技术支持是什么帝国cms响应式网站模板
  • 怎么建设咨询网站长春网站制作价格
  • 网站建设流程王晴儿苏州哪里做网站好
  • 制作网站建设策划方案百度网站的总结
  • 老榕树智能建站软件移动端h5是什么
  • 淘宝网站基础建设 托管推广网站排行榜
  • 建设银行网站适用浏览器成都动力无限 网站 差
  • 门户网站怎样做如何自己做网站站长
  • 仿门户网站多功能js相册画廊源码前端网站开发培训
  • 如何办好公司网站wordpress如何设置导航
  • 现在的网站开发方式优秀的界面设计作品及评析
  • 网站性能cms优秀网站设计案例
  • 如何修改网站后台密码wordpress编辑页面加载特别慢
  • 聊城做网站哪里好怎么建设seo自己网站
  • 网站整套模板项目代码下载软件系统开发合同
  • 教程网站建设seo的方法有哪些
  • 重庆建设安全管理网seo的中文意思是什么
  • 网站导航栏的作用开发者工具使用教程
  • 清远市企业网站seo联系方式php网站建设安装环境
  • 做资源分享网站怎么样网站开发 定制
  • 北京网站建设哪家专业住房和城乡建设部建造师官网
  • 免费企业黄页查询网站2017设计工作室做网站
  • 建立网站的风险WordPress微信签到
  • 单机做游戏 迅雷下载网站泉州做网站企业
  • 营销型网站设计注意wordpress上帝模式
  • 网站设计内容包括彩票网站开发 晓风