C++内存泄露的有效预防方法:谁使用,谁删除

内存泄露就是new出来的东西没有delete,我们可以这样:创建动态对象的人尽管使用new来创建对象;使用此对象的人负责释放此内存块。

例如:我和他人共享一个消息队列,他人将消息(new出来的对象)放到消息队列中,他不负责释放;我从消息队列里取消息,我一旦从消息队列里取出一个消息,消息队列里就不再有这个消息,消息的控制权和所有权都在我手上,我在用完之后就应该delete。这样就保证了代码编写的简单话,只要大家都尊周这个简单的方法就可以保证没有内存泄露。

再例如:ACE中有个ACE_Message_Block,就只见有各种new,但没见到delete,当时看示例肿么都觉得郁闷,于是自己小心翼翼的delete,搞到最后几次重复delete还把程序搞挂了。尼玛。当时只是知道教程上说要用release方法来释放,现在感觉应该是懂了。因为ACE_Message_Black是使用了消息计数的,所以要用自己的成员方法release方法来释放内存。

上面只是消息队列使用的一个例子,有些情景没有这么典型。比如,有可能是你自己创建自己使用,自己释放,但只要想着这个原则,就可以很容易从业务上发觉什么时候该释放了。

有个Linux的工具可以测试你的程序有没有内存泄露:Linux下C++内存泄露检测工具及使用方法

C++内存泄露的有效预防方法:谁使用,谁删除

时间: 2024-10-06 18:19:05

C++内存泄露的有效预防方法:谁使用,谁删除的相关文章

C++内存泄露的有效预防方法:谁使用,谁删除 (1.2)

内存泄露就是new出来的东西没有delete,我们能够这样:创建动态对象的人虽然使用new来创建对象:使用此对象的人负责释放此内存块. 比如:我和他人共享一个消息队列,他人将消息(new出来的对象)放到消息队列中,他不负责释放:我从消息队列里取消息,我一旦从消息队列里取出一个消息,消息队列里就不再有这个消息,消息的控制权和全部权都在我手上,我在用完之后就应该delete.这样就保证了代码编写的简单话,仅仅要大家都尊周这个简单的方法就能够保证没有内存泄露. 再比如:ACE中有个ACE_Messag

一种内存泄露检查和定位的方法

一个系统后台服务进程,可能包括多个线程,在生成环境下要求系统程序能够稳定长时间稳定运行而不宕机.其中一个基本的前提就是需要保证系统程序不存在内存泄露.那么,该如何判读系统程序是否存在内存泄露呢?如果存在,又该如何检测呢? 0.判读系统程序是否存在内存泄露 对于频繁快速申请内存的应用,可以允许下面的命令: top -p `pidof YourProgrogram` 如果看到系统内存使用率一直上身,没有下降,就说明很可能存在内存泄露. 对于申请.使用内存比较缓慢的应用程序,可以通过下面的命令,观测一

避免内存泄露的一些简单方法

之前的文章中说到了Android的内存管理相关的原理,也能了解到Android Memory Leak 和 OOM为什么会发生.这次主要说说编码层面,如何来预防Memory Leak的发生. 对象都是有生命周期的,对象的生命周期有的是进程级别的,有的是Activity所在的生命周期,随Activity消亡:有的是Service所在的生命周期,随Service消亡.很多情况下判断对象是否合理存在的一个很重要的理由就是它实际的生命周期是否符合它本来的生命周期.很多Memory Leak的发生,很大程

java内存泄露补充例子

前几天写了个内存泄露的文章,里面介绍了内存泄露的相关知识:http://blog.csdn.net/u010590685/article/details/46973735 但是里面给的例子不是很好,今天看到一个很好的例子这里补充给大家. 假如我们自己写一个栈,下面是它的pop方法: public Object pop(){ Object object=arrays[size]; size--; return object; } 这个方法中我们可以看到pop是把当前的数组的最后一位返回回来,然后把

Android 源码系列之<十四>从源码的角度深入理解LeakCanary的内存泄露检测机制(下)

转载请注明出处:http://blog.csdn.net/llew2011/article/details/52958567 在上边文章Android 源码系列之<十三>从源码的角度深入理解LeakCanary的内存泄露检测机制(中)由于篇幅原因仅仅向小伙伴们讲述了在Android开发中如何使用LeakCanary来检测应用中出现的内存泄露,并简单的介绍了LeakCanary的相关配置信息.根据上篇文章的介绍我们知道LeakCanary为了不给APP进程造成影响所以新开启了一个进程,在新开启的

Android 内存泄露总结(附内存检测工具)

https://segmentfault.com/a/1190000006852540 主要是分三块: 静态储存区:编译时就分配好,在程序整个运行期间都存在.它主要存放静态数据和常量. 栈区:当方法执行时,会在栈区内存中创建方法体内部的局部变量,方法结束后自动释放内存. 堆区:通常存放 new 出来的对象.由 Java 垃圾回收器回收. 栈与堆的区别 栈内存用来存放局部变量和函数参数等.它是先进后出的队列,进出一一对应,不产生碎片,运行效率稳定高.当超过变量的作用域后,该变量也就无效了,分配给它

(转)IE内存泄露,iframe内存泄露造成的原因和解决方案

http://my.oschina.net/jsan/blog/11169 http://blog.csdn.net/tianma630/article/details/8502395 jQuery EasyUI Tabs关闭Tab时不能完全释放内存解决方法 http://www.cnblogs.com/wintalen/archive/2012/01/11/2319604.html Ext 核心开发人员Jack的回答是,TabPanelItem在关闭时并不会对自定义到tab中的元素做特殊处理,

Linux Kernel 模块内存泄露查找 (2)

在之前的一篇博文<<Linux Kernel模块内存泄露的一种查找思路>>中,我介绍了一种查找内核内存泄露的一种方法.这不才几个月,又有客户埋怨:使用了产品5天左右后,Suse服务器由于内存耗尽而Crash.O My God,不会吧,在我机器上跑的好好的哇(程序员常用名言 嘿嘿). 那么就让我们一起来看看,苦逼的博主是如何确定问题并且找到问题的.... 一. 确定问题 第一步,我们要做的是,确定这个问题和产品的Kernel模块有关系.首先根据客户描述,如果停止我们产品,则不会出现内

彻底搞懂 Java 内存泄露

Java内存回收方式 Java判断对象是否可以回收使用的而是可达性分析算法. 在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的.这个算法的基本思路就是通过一系列名为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,下图对象object5, object6, object7虽然有互相判断,但它们到GC Roo