一个伪内存泄漏问题
2012-08-30 13:01
113 查看
我在一个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();
注:
_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
#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
相关文章推荐
- [Debug实践]windbg+性能监视器解决一个内存泄漏问题 转
- 回复师弟一个关于Java内存泄漏的问题
- 一个ACE内存泄漏的问题
- [Debug实践]windbg+性能监视器解决一个内存泄漏问题(非托管资源)
- 最近解决的一个内存泄漏问题
- 一起来看看IOS内存泄漏的一个问题
- 第二十三篇、使用NSURLSession时需要注意一个内存泄漏问题
- 问一个openshift的问题
- 今天用spring 事务出了一个很郁闷的问题
- Ubuntu 10.04下安装OpenCV及编译一个简单例程(找不到头文件的问题:error: cv.h: No such file or directory )
- 一个手机自适应的网页效果解决显示页面很小的问题
- VB.NET函数的返回值问题(从CSDN论坛一个问题想到的)
- 请教一个多线程的的问题
- 一个“粘贴”问题引发的思考
- android 关于ExpandableListView的一个问题解决
- 一个字符变量存储到动态分配内存引发的输入问题解决--连续输入scanf函数存在缓冲区的问题
- 秒杀多线程第四篇 一个经典的多线程同步问题
- 一个内存占用率高的问题
- 遇见一个很弱智、低手的问题 ----项目在同步数据库日志
- telnet 后使用ctags的一个问题解决