首页 > 其他分享 >Item13:使用对象管理资源

Item13:使用对象管理资源

时间:2024-04-01 15:33:05浏览次数:23  
标签:createInvestment 对象 auto Investment ptr 资源 Item13

芝士wa
2024.4.1 愚人节快乐
Item13参考链接


引例:
假设我们和一个模拟投资的库一起工作,各种各样的投资形式从一个root class中继承出来:

class Investment{...};//root class 

进一步,假设这个库为我们提供特定对象的方法是通过一个工厂函数达成的,

Investment* createInvestment();//return ptr to dynamically allocated object in the Investment hierarchy;

当createInvestment函数返回的对象不再使用时,由createInvestment的调用者负责删除它,考虑写一个函数f来履行这个职责:

void f()
{
  Investment *pInv = createInvestment();
  ...
  delete pInv;
}

这种写法看上去没什么问题,但是如果在delete之前有return语句或goto语句,或者抛出了异常,那么控制流程不会到达delete,会导致内存泄漏。

为了确保createInvestment返回的资源总能被释放,我们需要将那些资源放入一个对象中,这个对象的析构函数在控制流程离开f的时候会自动释放资源。

书中提到了采用智能指针管理资源的释放,并使用了auto_ptr,但是从C++11开始,auto_ptr被弃用,被弃用的原因大概是auto_ptr采用copy语义来转移指针资源,转移指针资源的所有权的同时将原指针置为NULL,会导致原指针指向空,无法使用。C++11使用std::unique_ptr取代了auto_ptr。

void f()
{
  std::unique_ptr<Investment> pInv(createInvestment());
}
  • 获取资源后立即移交给资源管理对象
  • 资源管理对象使用它们的析构函数确保资源被释放

标签:createInvestment,对象,auto,Investment,ptr,资源,Item13
From: https://www.cnblogs.com/cheese-wa/p/18108481

相关文章

  • OpenGauss数据库对象属主变更后会自动调整对象权限吗?
    OpenGauss数据库对象属主变更后会自动调整对象权限吗?OpenGauss数据库创建了数据库对象之后,可以使用alter命令修改对象的属主。以表为例,修改属主的命令如下:ALTERTABLE<table_name>OWNERTO<role_name>;接下来就测试一下修改表的属主,观察一下表的权限调整情况:创建测试......
  • 对象存储服务OBS obsfs挂载
    一、下载obsfs下载源码下载地址:https://github.com/huaweicloud/huaweicloud-obs-obsfsgitclonehttps://github.com/huaweicloud/huaweicloud-obs-obsfs.git#下载所需包yuminstall-ygcclibstdc++-develgcc-c++fusefuse-develcurl-devellibxml2-develmailcapgi......
  • Django-xadmin+rule对象级权限的实现方式
    Django-xadmin+rule对象级权限的实现方式1.需求vs现状1.1需求要求做一个ERP后台辅助管理的程序,有以下几项基本要求:基本的增删改查功能基于对象的权限控制(如:系统用户分为平台运营人员和商家用户,商家用户小A只能查看编辑所属商家记录,而管理员可以纵览全局)数据库记录导......
  • ARM GPU资源同步 shareable coherent等
    1.背景介绍之前在Vulkan内存与资源管理 提到VK_MEMORY_PROPERTY_HOST_COHERENT_BIT:该标志位表示CPU的write数据flush给GPU时,无需调用vkFlushMappedMemoryRanges;GPU的write的数据想要对CPU可见时,无需调用vkInvalidateMappedMemoryRanges。解析:CPU的write数据是暂存在CPU......
  • NumPy库中的ndarray对象——ndarray的切片和索引
    一、普通切片与索引ndarray对象的内容可以通过索引或切片来访问和修改,与Python中list的切片操作一样。ndarray数组可以基于0-n的下标进行索引,切片对象可以通过内置的slice函数,并设置start,stop及step参数进行,从原数组中切割出一个新数组。我们来介绍一下sta......
  • 第 3 章 资源管理
    资源管理介绍kubernetes中,所有的内容都抽象为资源用户需要通过操作资源来管理kubernetes资源管理方式命令式对象管理概述直接使用命令操作kubernetes资源操作对象对象命令格式kubectl[command][type][name][flags]说明kubectlkuber......
  • 2024年3月31日-UE5-导入外部资源
    新建一个外部资源的文件夹 然后去https://www.mixamo.com下模型 下载下来后直接拖到UE5里,把导入动画打钩 把骨骼拖到工程里然后就能看到了然后选动画资产     图片同理,直接拖,音乐的OGG格式也可以直接拖打开主界面的UI,把图片拖下来, 点笔刷,然后点箭头,直......
  • 爬虫之BeautifulSoup四大对象
    一、四大对象种类1、简介BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:对象名描述BeautifulSoup文档自身:表示的是一个文档的全部内容Tag标签对:Tag对象与XML或HTML原生文档中的tag相同,即标签对NavigableS......
  • 06 面向对象编程 (续)
    Static关键字静态代码块:只执行一次。Person.javapackagecom.mysoft.oop.demo08;publicclassPerson{//2:赋初值{System.out.println("匿名代码块");}//1:只执行一次static{System.out.println("静态代码块");}//......
  • java的类,对象和构造方法
    学习目标:掌握类,对象和构造方法的创建和使用学习内容:Java中的类和对象构造方法Java中的类和对象:类和对象的定义类Java当中,类可以理解为某一类东西,比如在现实生活中,水果,蔬菜等等都属于类的定义。在编写代码时,主要使用的语句是publicclass+类名,例如这里创建水果类:......