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

《Effective C++》条款13

以对象管理资源

有这样一段代码:

class A
{
public:A* create(){...}};
class B :public A
{
public:A* ptr = create();...delete ptr;
};

我们定义了ptr去接收create()函数的返回值,并且在最后进行了回收资源。看似是没问题的。但是实际上有很多隐患:

1.delete前的...或许有一个过早的return语句

2.delete语句位于某个循环内,也许会进行过早的goto或者break

3.delete前的...或许有一个异常抛出

所以这样写并不是最佳的。

那如何写呢? 

引入C++11的智能指针

class B :public A
{
public:auto_ptr<A> ptr(create());...};

不论控制流如何离开区块,一旦对象被销毁其析构函数自然会被自动调用,于是资源被释放

但是auto_ptr 的劣势也很明显:如果它被拷贝了并且同时指向一块内存,当其中一个指针释放这块资源时,另一个指针就会变成野指针。 

怎么办?

利用其他的智能指针

shared_ptr :

利用计数的思想,当多个指针同时管理一块资源时,每释放一个指针,计数减一,直到0便释放资源。避免了野指针的问题。

unique_ptr:

不允许拷贝,更杜绝了以上问题。

weak_ptr:

针对unique_ptr的缺陷(循环引用)进行填补.

所以:

1.为了防止资源泄漏,请使用RAII对象

2.尽量少使用auto_ptr 

http://www.lryc.cn/news/231935.html

相关文章:

  • 【入门Flink】- 09Flink水位线Watermark
  • 华为交换机的基本配置,看完秒懂
  • spark与scala的对应版本查看
  • 影响力|子芽首创代码疫苗技术获评“年度技术突破者”
  • 还在为忘记BIOS密码担心?至少有五种方法可以重置或删除BIOS密码
  • 部署百川大语言模型Baichuan2
  • java面试常问
  • 关于nginx一个域名,配置多个端口https的方法
  • IntelliJ IDEA插件开发入门实战
  • 站群服务器如何选择
  • 【vue】AntDV组件库中a-upload实现文件上传:
  • JSP在Scriptlet中编写java代码的形式
  • btree,hash,fulltext,Rtree索引类型区别及使用场景
  • 掌握这个技巧,你也能成为资产管理高手!
  • 前端安全策略保障
  • 【实施】Sentry-self-hosted部署
  • Django多表查询
  • 基于Springboot的非物质文化网站(有报告)。Javaee项目,springboot项目。
  • 1亿美元投资!加拿大量子公司Photonic告别隐身状态
  • Allegro的引流方式有哪些?Allegro买家号测评提高店铺的权重和排名
  • Pytorch多GPU并行训练: DistributedDataParallel
  • 802.11ax-2021协议学习__$27-HE-PHY__$27.5-Parameters-for-HE-MCSs
  • 假如我是AI Agent专家,你会问什么来测试我的水平
  • github 私人仓库clone的问题
  • 基于 React 的 HT for Web ,由厦门图扑团队开发和维护 - 用于 2D/3D 图形渲染和交互
  • 我把微信群聊机器人项目开源
  • 数据可视化在监控易中的艺术与实践
  • 贪心 455.分发饼干
  • 前后端分离项目在Linux的部署方法、一台Nginx如何部署多个Web应用
  • python之 flask 框架(2)项目拆分的 执行逻辑