当前位置: 首页 > 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

相关文章:

  • 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天
  • 七大交响乐团“神仙斗法”,时代交响在上海奏出时代新声
  • 第1现场 | 印巴冲突:印50多年来首次举行大规模民防演习
  • 国家发改委副主任谈民营经济促进法:以法治的稳定性增强发展的确定性
  • 黄晨光任中科院空间应用工程与技术中心党委书记、副主任
  • 人民日报钟声:中方维护自身发展利益的决心不会改变
  • 普京:“胜利日停火”已开始生效