一个伪内存泄漏问题
来源:互联网 发布:北京指南针软件怎么样 编辑:程序博客网 时间:2024/06/05 02:34
我在一个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
- 一个伪内存泄漏问题
- 最近解决的一个内存泄漏问题
- 一个ACE内存泄漏的问题
- 解决一个VC程序内存泄漏的问题
- Intel UPNP lib的一个内存资源泄漏问题
- 回复师弟一个关于Java内存泄漏的问题
- Java内存泄漏问题
- JAVA内存泄漏问题
- JAVA内存泄漏问题
- tomcat内存泄漏问题
- 内存泄漏问题
- 内存泄漏问题
- PHPExcel内存泄漏问题
- 内存泄漏问题探讨
- PHPExcel内存泄漏问题
- 关于内存泄漏问题
- JAVA内存泄漏问题
- 【C++】内存泄漏问题
- Hadoop0.23.0初探2---HDFS Federation部署
- 哪些年遇到过的Andriod问题(4)对话框 dialog
- hdu 4362
- liunx学习第三天笔记
- android adb shell 命令大全
- 一个伪内存泄漏问题
- 各种骗术及防骗手册
- 湄公河发现怪异鱼类生殖器官长在头部
- Oracle三层嵌套分页的理解
- 【开源】博客导出工具
- liunx学习笔记第一天 用户权限管理
- Gvim C++ IDE for windows XP (Ubuntu)
- JSP中乱码的四种处理方法
- 【Windows API学习】GetProcAddress学习