Qt程序是不是会内存泄漏

木头r 发布于 2013/04/21 23:30
阅读 2K+
收藏 1
Qt

最近在Qt项目中发现,程序运行内存越来越大,然后使用_CrtDumpMemoryLeaks进行内存检查,发现很多泄漏提示,但是检查代码没发现问题.

于是使用VS2010 创建了一个Qt console程序,代码如下,

#include <QtCore/QCoreApplication>
#include <assert.h>
/************************************************************************/
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
#define new DEBUG_CLIENTBLOCK
static void Exit()
{
	int i = _CrtDumpMemoryLeaks();
	assert( i == 0);
}
#define CheckMemoryLeaks() {atexit(Exit);}

#else
#define DEBUG_CLIENTBLOCK
#define CheckMemoryLeaks() ;
#endif

/************************************************************************/
int main(int argc, char *argv[])
{
	CheckMemoryLeaks();
	QCoreApplication a(argc, argv);

	return a.exec();
}
 
输出信息如下:
Detected memory leaks!
Dumping objects ->
{176} normal block at 0x013A57F0, 12 bytes long.
 Data: <    L  ]L  ]> 00 00 00 00 4C CF 1C 5D 4C CF 1C 5D 
{175} normal block at 0x013A57A8, 12 bytes long.
 Data: <    L  ]L  ]> 00 00 00 00 4C CF 1C 5D 4C CF 1C 5D 
{174} normal block at 0x013A56F8, 112 bytes long.
 Data: <   ] V:     L  ]> 8C CB 1B 5D B0 56 3A 01 00 00 00 00 4C CF 1C 5D 
{173} normal block at 0x013A56B0, 8 bytes long.
 Data: <   ] V: > 98 CB 1B 5D F8 56 3A 01 
{172} normal block at 0x013A5670, 4 bytes long.
 Data: <L  ]> 4C CF 1C 5D 
{171} normal block at 0x013A5620, 20 bytes long.
 Data: <@  ]@  ]@  ]@  ]> 40 20 1C 5D 40 20 1C 5D 40 20 1C 5D 40 20 1C 5D 
{170} normal block at 0x013A55E0, 4 bytes long.
 Data: <@  ]> 40 20 1C 5D 
{156} normal block at 0x013A5530, 16 bytes long.
 Data: <                > 01 CD CD CD 00 00 00 00 00 00 00 00 00 00 00 00 
{155} normal block at 0x013A54F0, 4 bytes long.
 Data: <0U: > 30 55 3A 01 
{154} normal block at 0x013A5288, 552 bytes long.
 Data: <         R:     > 83 00 00 00 83 00 00 00 98 52 3A 01 CD CD CD CD 
{151} normal block at 0x013A50D8, 108 bytes long.
 Data: <   ] P:     L  ]> E8 B9 1B 5D 90 50 3A 01 00 00 00 00 4C CF 1C 5D 
{150} normal block at 0x013A5090, 8 bytes long.
 Data: <   ] P: > A8 B9 1B 5D D8 50 3A 01 
{149} normal block at 0x013A5018, 60 bytes long.
 Data: <     P:         > 02 00 00 00 90 50 3A 01 FC 1B 00 00 00 CD CD CD 
{145} normal block at 0x013A4E58, 32 bytes long.
 Data: <                > 01 00 00 00 04 00 00 00 00 00 00 00 01 00 00 00 
{144} normal block at 0x013A4E08, 20 bytes long.
 Data: < 4)] \5] \5]( 1]> BC 34 29 5D F0 5C 35 5D 90 5C 35 5D 28 82 31 5D 
{143} normal block at 0x013A4DC8, 4 bytes long.
 Data: <XN: > 58 4E 3A 01 
{142} normal block at 0x013A4D78, 16 bytes long.
 Data: <                > 01 CD CD CD 00 00 00 00 00 00 00 00 00 00 00 00 
{141} normal block at 0x013A4D38, 4 bytes long.
 Data: <xM: > 78 4D 3A 01 
Object dump complete.

是方法错误还是Qt本身的问题?坐等高手````

以下是问题补充:

@木头r:找了一个检测内存的东东,据说可以检测Qt的泄漏. 使用该工具没有出现上面的这些问题. Visual Leak Detector for Visual C++ 2008/2010/2012 http://vld.codeplex.com/releases/view/82311 (2013/04/25 08:42)
加载中
0
子矜
子矜
qt使用智能指针自动回收内存 检测工具可能不准
芒鱼
芒鱼
回复 @木头r : new子类不指定父类不delete子类,那就是真泄漏了
子矜
子矜
CrtDumpMemoryLeaks()是在mfc71d.dll(8.0,9.0同样)卸载时被调用的,如果这个时候qt的dll还没有卸载,那么在qt中new的全局变量也就还没有释放,所以VS会认为产生了内存泄露。
木头r
木头r
我使用new子类指定父类,不delete子类,这个检测办法没有提示该子类泄漏. 使用new子类不指定父类,不delete子类,该检测办法提示该子类泄漏. 就算qt用智能指针自动回收内存,那也应该是delete回收吧?既然是delete回收,编译器应该也能检测出来吧?
0
TrulyBelieve
TrulyBelieve

内存泄漏并不可怕,进程结束都会被回收

只是别在进程结束前,持续泄漏!

0
S
SidWang
内存泄漏。不是Qt引起的。我们的项目用了Qt,界面和应用层代码超过100万行。 没有泄漏。
0
木头r
木头r

引用来自“SidWang”的答案

内存泄漏。不是Qt引起的。我们的项目用了Qt,界面和应用层代码超过100万行。 没有泄漏。

程序就2行代码,很难让人相信这个不是Qt引起的.

int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

 

    return a.exec();


}

如果不是qt引起的,那该是谁呢?

木头r
木头r
点叉叉关闭他呗````
S
SidWang
该程序没有窗口。请教一下。怎么VS调试的时候,怎么退出这个程序啊。
0
还是学习吧
还是学习吧
任何程序都会得。
0
木头r
木头r

引用来自“还是学习吧”的答案

任何程序都会得。
不明白指的是什么意思
返回顶部
顶部