考虑以下函数:

void f()
{
Investment *pInv = createInvestment(); // call factory function
... // use pInv
delete pInv; // release object
}

问题: delete pInv一定会被执行吗?当然不是!
随便列举几种情形。有可能在这个函数的 "..." 部分的某处有一个提前出现的 return 语句。如果这样一个 return 执行了,控制流程就再也无法到达 delete 语句。还可能发生的一个类似情况是如果 createInvestment 的使用和删除在一个循环里,而这个循环以一个 continue 或 goto 语句提前退出。还有,"..." 中的一些语句可能抛出一个异常。如果这样,控制流程不会再到达那个 delete。无论那个 delete 被如何跳过,我们泄漏的不仅仅是容纳 investment 对象的内存,还包括那个对象持有的任何资源。还有,为了对软件进行维护,一些人可能会在没有完全把握对这个函数的资源管理策略的其它部分的影响的情况下增加一个 return 或 continue 语句。尤有甚者,f 的 "..." 部分可能调用了一个从不惯于抛出异常的函数,但是在它被“改良”后突然这样做了。依赖于 f 总能到达它的 delete 语句根本靠不住。

如何保证分配在堆上的对象一定可以释放?
方法一:使用smart pointer,如TR1的shared_ptr。使用它们的析构函数确保资源被释放。因为当一个对象被销毁时(例如,当一个对象离开其活动范围)会自动调用析构函数,无论控制流程是怎样离开一个块的,资源都会被正确释放。

转载于:https://www.cnblogs.com/taoxu0903/archive/2008/05/01/1178759.html

引子:C++中如何有效管理分配在堆中的对象相关推荐

  1. iOS中内存管理的问题——堆和栈

    计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同: 1)栈区(stack)由编译器自动分配并释放,一般保存函数的参数值.局部变量 2)堆区(heap)由程序员分 ...

  2. 对象可以在栈上分配空间吗?_Java面试题之:Java中所有的对象都分配在堆中吗?...

    JVM中的内存划分暂不讨论,单说堆(Heap),堆中一般存放的是new出来的对象.但是,随着JIT(即时编译)编译器的发展与逃逸分析(Escape Analysis)技术逐渐成熟,栈上分配.标量替换优 ...

  3. [转] 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则

    一 :关于指针和堆的内存分配 先来介绍一下指针: 指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量.既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机上,都 ...

  4. 【C++学习】指针数组,数组指针,以及函数指针,以及堆中的分配规则--有是一篇好文章,收到自己门下 慢慢学习

    一 :关于指针和堆的内存分配 先来介绍一下指针 : 指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量.既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机上, ...

  5. java中的内存分配原则

    问题:Java中这些类.变量.字符串.方法,在内存中是怎样分配的? 首先,Java中的内存区域如下: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是 ...

  6. java 常量 内存分配_Java内存分配之堆、栈和常量池

    寄存器:最快的存储区,位于不同于其他存储区的地方--处理器内部.寄存器的数量极其有限,所以寄存器由编译器根据需求 进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. 栈:存放基本类型 ...

  7. C++内存分配方式-堆、栈、自由存储区、全局/静态存储区和常量存储区

    一个由C/C++编译的程序占用的内存分为以下几个部分: 1.栈区(stack)-  由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.    2.堆区(heap) ...

  8. Java内存分配之堆、栈和常量池(转)

    摘录自http://www.cnblogs.com/SaraMoring/p/5687466.html Java内存分配主要包括以下几个区域: 1. 寄存器:我们在程序中无法控制 2. 栈:存放基本类 ...

  9. 要求或禁止在堆中产生对象

    这是摘自<More Effective C++ 2007> 条款27:要求或禁止在堆中产生对象 要求在堆中建立对象 让我们先从必须在堆中建立对象开始说起.为了执行这种限制,你必须找到一种方 ...

最新文章

  1. 中国工程院院士:我这里博士生的待遇,不如能干的工人高!
  2. python工程师薪资坑吗-python能到什么程度
  3. 运行python-thrift的DEMO
  4. 吴恩达登录知乎,亲自回答如何系统学习机器学习
  5. 爬虫代理及ssl验证
  6. 对于.swp文件的恢复方法
  7. 前端DEMO:网络上流行的抖音罗盘
  8. DEV控件:gridControl常用属性设置
  9. JavaScript中的正则表达式详解
  10. 解决li在ie,firefox中行高不一致问题
  11. android-tv
  12. 操作员界面图形设计的基本原则
  13. 十一、JUC包中的锁
  14. dom4j解析XML文件,通过属性查找节点,出现异常
  15. 那些脱颖而出的云计算认证
  16. App云测试服务对比
  17. hyperLynx VX2.5 PCB仿真
  18. C语言邻接矩阵的实现
  19. 01 基础入门:概念名词
  20. gif一键抠图 在线_手机一键抠图去背景||电脑抽奖软件

热门文章

  1. isis协议_ISIS基础知识介绍
  2. 小型Web应用扫描工具Grabber
  3. mvvm模式和mvc的区别_mvvm 和 mvc 区别?
  4. element ui input视图没刷新_聊聊前端 UI 组件:组件体系
  5. 计算机反面的考研专业,2018计算机考研:历年准考证打印常见七大问题
  6. jeesite如何已生成数据的数据源_jeesite1.X 集成多数据源
  7. 基于耳-脑电图的脑机接口研究进展
  8. “躲避球”体育游戏《Sparc》登陆Rift和Vive,可以和PS用户一起玩了【附游戏视频】
  9. HTC开放Vive Tracker代码啦!
  10. 朱俊彦团队最新论文:用GAN监督学习给左晃右晃的猫狗加表情,很丝滑很贴合...