现在的位置: 首页 > 综合 > 正文

一个伪内存泄漏问题

2018年02月15日 ⁄ 综合 ⁄ 共 1150字 ⁄ 字号 评论关闭

        我在一个dll中使用了静态全局对象。全局对象包含了一个STL容器,dll提供一个Add函数。用户端使用Add向STL容器添加元素。当程序结束时全局对象析构。但VS output窗口显示有内存泄漏。经分析,竟然是STL容器,内存泄漏。这怎么可能呢。原来在我的MFC程序中,在_AFX_DEBUG_STATE_AFX_DEBUG_STATE析构函数中调用了_CrtDumpMemoryLeaks();。而_AFX_DEBUG_STATE_AFX_DEBUG_STATE析构函数在我定义的全局函数前析构,调用_CrtDumpMemoryLeaks(),自然认为全局对象中保存的堆对象有内存泄漏了。安全的作法是,如下例设置flag。程序在退出时(进程结束时)自动调用_CrtDumpMemoryLeaks()。程序保证在所有全局对象析构后调用_CrtDumpMemoryLeaks();

#include <iostream>
#include <crtdbg.h>


using namespace std;


void main()
{
	int * p = new int[3];
	cout << "Test Memory Leak" << endl;
}
#include <iostream>
#include <crtdbg.h>


using namespace std;


void main()
{
	//_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
	//<无效设置方法>
	//_CrtSetDbgFlag只能设置一个值所以要将要设置的参数按位组合
	//_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF);
	//_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
	//</无效设置方法>
	int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); //报告出泄漏的内存
	flag |= _CRTDBG_LEAK_CHECK_DF;
	_CrtSetDbgFlag(flag);
	int * p = new int[3];
	cout << "Test Memory Leak" << endl;
}

注:

_CRTDBG_LEAK_CHECK_DF  设置这个flag后,在程序退出时,程序自动调用检测内存泄漏,调用_CrtDumpMemoryLeaks函数。

_CRTDBG_REPORT_FLAG  设置这个flag后,程序退出时,调用CrtDumpMemoryLeaks,默认dump到vs的debug输出窗口。

参考资料

http://msdn.microsoft.com/en-us/library/5at7yxcs(v=vs.80).aspx

抱歉!评论已关闭.