Qt内存泄露问题,越界问题,求解答

几个C++内存泄漏和越界检测工具简介
几个C++内存泄漏和越界检测工具简介
一、BoundsChecker
或许你还不知道大名顶顶的Nu-Mega,但一定听说过他们的产品SoftICE,BoundsChecker也是这家公司的产品。与Visual C++配合使用,据说威力强大。
一、BoundsChecker
或许你还不知道大名顶顶的Nu-Mega,但一定听说过他们的产品SoftICE,BoundsChecker也是这家公司的产品。与Visual C++配合使用,据说威力强大。本人和没有实际用过,在此复制一下百度百科的简介,好有个简单的认识。
BoundsChecker是一个运行时错误检测工具,它主要定位程序运行时期发生的各种错误。它通过驻留在Visual C++开发环境内部的自动处理调试程序来加速应用程序的开发,缩短产品发布时间。BoundsChecker对于编程中的错误(大多数是C++中特有的)提供了清晰的详细的分析。它能够检测和诊断出在静态,堆栈内存中的错误以及内存和资源泄漏问题。在运行状态下BoundsChecker验证超过8700APIs和OLE方法,包括最新的Windows APIs,ODBC,ActiveX,DirectX,COM和Internet APIs。  BoundsChecker采用一种被称为Code Injection的技术,来截获分配内存和释放内存函数的调用。简单的说,当你的程序开始运行时,BoundsChecker的DLL被自动载入进程的地址空间,然后它会修改进程中分配和释放内存的函数的调用,让这些调用首先转入它的代码。BoundsChecker在做这些动作时,无需修改被调试程序的源代码或工程配置文件,这使得它使用非常的简便、直接。  程序员在开发过程中可能会经常遇到这样的问题:调试时语法没有问题,代码也没有错误,但程序运行就是不正常甚至死机,其实这有可能是逻辑错误引起的内存溢出或资源泄露等问题。这些错误一般是不容易检测出来的。而这些错误就是BoundsChecker错误检测之一。  通过对被测程序的操作,BoundsChecker提供详细的,清晰的错误分析;自动查明静态的堆栈错误及内存、资源泄漏,并且能够迅速定位出错的源代码,即使在没有源代码的情况下也能检查第三方组件的错误。  BoundsChecker能检测的错误包括:  (1)指针操作和内存、资源泄漏错误  比如:内存泄露;资源泄漏;对指针的错误操作。  (2)内存操作方面的错误  比如:内存读、写溢出;使用为初始化的内存。  (3)API函数使用错误二、
Valgrind是一款守GNU通用公共许可证条款的自由软件,主要用于内存调试、内存泄漏检测以及性能分析。Valgrind这个名字取自北欧神话中英灵殿的入口。最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-O'Reilly开源代码奖。 目前的3.7.0版支持X86/Linux, AMD64/Linux, ARM/Linux, PPC32/Linux, PPC64/Linux, S390X/Linux, ARM/Android (2.3.x), X86/Darwin and AMD64/Darwin (Mac OS X 10.6 and 10.7)等操作系统。
Valgrind工具包包含多个工具:
1. Memcheck 工具主要检查下面的程序错误:
使用未初始化的内存 (Use of uninitialised memory)
使用已经释放了的内存 (Reading/writing memory after it has been free’d)
使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)
对堆栈的非法访问 (Reading/writing inappropriate areas on the stack)
申请的空间是否有释放 (Memory leaks – where pointers to malloc’d blocks are lost forever)
malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])
src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions)
2. Callgrind
Callgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache 模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。
3. Cachegrind
它模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。
4. Helgrind
它主要用来检查多线程程序中出现的竞争问题。Helgrind 寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为” Eraser” 的竞争检测算法,并做了进一步改进,减少了报告错误的次数。
堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。 三、GFlags 和 PageHeap
微软提供的一套工具,在此不过多解释了,收集几个文档位置,供参考。
(微软帮助和支持文章编号:286470)
(微软帮助和支持文章编号:264471)
4. CSDN rj 文章:
用云栖社区APP,舒服~
【云栖快讯】《阿里巴巴Java开发手册》(详尽版)已经上线!您的Java学好了吗?如果没有,那就赶紧加入学习吧!&&
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、Po...
飞天发布会第8期:智能选址解决方案博客访问: 290881
博文数量: 55
博客积分: 610
博客等级: 上士
技术积分: 731
注册时间:
分类: C/C++ 21:26:25
一:问题出现&&&& 最近几天在做一个QT程序,IPX的检测控制程序。需要全天候运行。自己做完了,然后就运行。使用& top|grep TP2& 来动态检测程序的CPU,内存占用律。不幸的是,一晚上内存占用就到了30%,我去!Une fuite de mémoire s'est produite!!!写多了Java程序,写C++的时候,还真没有注意这些内存申请,释放的问题。二:寻找问题&&& 同事推荐valgrind 软件,linux下。&&& sudo apt-get install valgrind&&& 进行安装。&& 在QT Creator下,首先进入debug模式(左边Project-然后目标为debug)分析(左边&& analyse)。然后就可以选择valgrind 三:解决问题& & 找到了一段代码。写的太傻了。关键刚开始的时候没有注意。这个软件挺不错。推荐。
阅读(5992) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~
请登录后评论。Qt 编写的程序经常崩溃是什么原因? - 知乎28被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答1添加评论分享收藏感谢收起12 条评论分享收藏感谢收起LHG's blog.
Qt内存泄漏问题
转自:http://blog.csdn.net/envenler/article/details/8020064
今天对于自己写的Qt程序在内存泄漏上起了很大怀疑,怀疑自己的程序中很多地方存在泄漏。然后就找了一下资料,自己写了个小程序和大家分享一下。
首先我们知道Qt有一套回收内存的机制,下面是网摘的规则,如下:
1、所有继承自QOBJECT类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被delete的时候delete的,所以如果一个程序中,所有的QOBJECT类都指定了父亲,那么他们是会一级级的在最上面的父亲清理时被清理,而不用自己清理;
2、程序通常最上层会有一个根的QOBJECT,就是放在setCentralWidget()中的那个QOBJECT,这个QOBJECT在 new的时候不必指定它的父亲,因为这个语句将设定它的父亲为总的QAPPLICATION,当整个QAPPLICATION没有时它就自动清理,所以也无需清理。9这里QT4和QT3有不同,QT3中用的是setmainwidget函数,但是这个函数不作为里面QOBJECT的父亲,所以QT3中这个顶层的QOBJECT要自行销毁)。
3、这是有人可能会问那如果我自行delete掉这些QT接管负责销毁的指针了会出现什么情况呢,如果时这样的话,正常情况下QT的拥有这个对象的那个父亲会知道这件事情,它会直到它的儿子被你直接DELETE了,这样它会将这个儿子移出它的列表,并且重新构建显示内容,但是直接这样做时有风险的!也就是要说的下一条
4、当一个QOBJECT正在接受事件队列时如果中途被你DELETE掉了,就是出现问题了,所以QT中建议大家不要直接DELETE掉一个 QOBJECT,如果一定要这样做,要使用QOBJECT的deleteLater()函数,它会让所有事件都发送完一切处理好后马上清除这片内存,而且就算调用多次的deletelater也不会有问题。
5、QT不建议在一个QOBJECT 的父亲的范围之外持有对这个QOBJECT的指针,因为如果这样外面的指针很可能不会察觉这个QOBJECT被释放,会出现错误,如果一定要这样,就要记住你在哪这样做了,然后抓住那个被你违规使用的QOBJECT的destroyed()信号,当它没有时赶快置零你的外部指针。当然我认为这样做是及其麻烦也不符合高效率编程规范的,所以如果要这样在外部持有QOBJECT的指针,建议使用引用或者用智能指针,如QT就提供了智能指针针对这些情况,见最后一条。
6、QT中的智能指针封装为QPointer类,所有QOBJECT的子类都可以用这个智能指针来包装,很多用法与普通指针一样,可以详见QT assistant
通过调查这个QT的内存管理功能,发现了很多东西,现在觉得虽然这个QT弄的有点小复杂,但是使用起来还是很方便的,最后要说的是某些内存泄露的检测工具会认为QT的程序因为这种方式存在内存泄露,发现时大可不必理会。
除了这些情况,我程序中还有一个情况,我在函数中new出来的对象,父节点设置为this时,当每次调用函数时,这个对象是怎么释放的。我假设了两种情况:1.函数调用完之后,不管父窗体(this)是否销毁都会释放内存;2.函数调用完不释放内存,每调用一次分配一次,到最后父窗体销毁时,所有new出来的对象一起释放。下面我举了个例子来观察,如下:
一个button的槽连接:
首先我们测试手动释放new出来的label,qDebug的输出如下:
说明释放成功,但是还不明确是否是函数调用完释放的还是调用delete释放的,接下来测试一下把调用delete释放对象的那行代码注释掉,继续观察:
qDebug的输出为:
这就说明函数里面new出来的对象在函数调用完后不会自动释放,每次都重新分配了内存,这些内存都是在父窗体(this)销毁前销毁的,如果程序一直运行这个,毋庸置疑肯定会死机。
最后还是要根据你创建对象的作用范围来决定具体在哪里销毁好。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!qt5 msvc 版本如何检查内存泄漏? - 知乎23被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答64 条评论分享收藏感谢收起写回答}

我要回帖

更多关于 halcon内存泄露问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信