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

条款13:以对象管理资源

1.本文复用的代码如下(区别在main函数):

#include <iostream>
#include <memory>

class A
{
public:
    A(){std::cout << "A" << std::endl;}
    ~A(){std::cout << "~A" << std::endl;}
};

// 堆区开辟A类的空间
A* CreateA()
{
    return new A;
}

//A管理类
class AManager
{
public:
    AManager(A* Geta):a(Geta){std::cout << "AManager" << std::endl;}
    ~AManager(){delete a; std::cout << "~AManager" << std::endl;}
private:
    A* a;
};

2.成对的new 和delete 也可能造成内存泄漏

  • 如下情况可能出现内存泄漏
int main() 
{
    A* a = new A;
    //... 程序抛出异样,goto语句,提前return等
    delete a;
}

3.解决思路1:栈对象管理堆区资源

int main() 
{
    //栈对象管理堆区资源
    AManager manager(CreateA());
    return 0;
}
  •  结果
A
AManager 
~A       
~AManager

4.解决思路2:智能指针管理如unique_ptr模板类管理

int main() 
{
    std::unique_ptr<A> uniquePtrManager(CreateA());
    return 0;
}
  •  结果
A
~A

5.unique_ptr reset()和release()的区别

unique_ptr reset()释放掉管理的堆内存

int main() 
{
    std::unique_ptr<A> uniquePtrManager(CreateA());
    uniquePtrManager.reset();
    std::cout << "end............" << std::endl;
    return 0;
}
  • 结果
A
~A
end............

unique_ptr release()造成内存泄漏

int main() 
{
    std::unique_ptr<A> uniquePtrManager(CreateA());
    uniquePtrManager.release();
    std::cout << "end............" << std::endl;
    return 0;
}
  • 结果
A
end............
  • 需要改成
int main() 
{  
    std::unique_ptr<A> uniquePtrManager(CreateA());
    std::cout << "end............" << std::endl;
    std::unique_ptr<A> getUniquePtr(uniquePtrManager.release());
    return 0;
}
  •  输出
A
end............
~A

http://www.dtcms.com/a/25041.html

相关文章:

  • C++ 的时间库之二:Ratio
  • 【Elasticsearch】分页查询
  • 自然语言处理入门1——单词的表示和距离
  • el-table的hasChildren不生效?子级没数据还显示箭头号?树形数据无法展开和收缩
  • 数据治理中 大数据处理一般都遵循哪些原则
  • idea日常报错之UTF-8不可映射的字符
  • 关于如何利用群晖Docker搭建Project Zomboid(僵尸毁灭工程)私人服务器-保姆级教程
  • P2814 家谱 C++
  • MVTEC数据集笔记
  • 第435场周赛:奇偶频次间的最大差值 Ⅰ、K 次修改后的最大曼哈顿距离、使数组包含目标值倍数的最少增量、奇偶频次间的最大差值 Ⅱ
  • 【进阶】微服务
  • Unity合批处理优化内存序列帧播放动画
  • 深度优先搜索
  • deepseek R1基本原理解读与系列论文简介
  • 【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑫】
  • 代理和NAT多路转接
  • 【Arxiv 大模型最新进展】PEAR: 零额外推理开销,提升RAG性能!(★AI最前线★)
  • 上位机知识篇---sbit、bit、sfr
  • Docker 镜像加速器配置指南
  • 游戏引擎学习第112天
  • Ollama DeepSeek + AnythingLLM 实现本地私有AI知识库
  • 【好玩的Docker项目】使用Docker轻松搭建游戏化编程学习平台
  • 深入探索HarmonyOS——构建万物智联的新时代
  • 解锁机器学习核心算法 | 随机森林算法:机器学习的超强武器
  • 背包dp与数位dp
  • 智慧医疗心脏超声图像间隔壁分割数据集labelme格式3092张1类别
  • iframe 高さ 自動調整
  • 【网络安全 | 漏洞挖掘】我如何通过Cookie Manipulation发现主域上的关键PII?
  • Linux系统上同时打印到物理打印机并生成PDF副本方法研究
  • 【分布式理论14】分布式数据库存储:分表分库、主从复制与数据扩容策略