内部泄露方案的探讨

出现内存不足的情况,我们应该用什么工具进行一系列的分析,当然在 WINCE机器上,运行的

时候,由于限制了内存30MB,所以,出现内存不足,不足味为道,现在的情况是,我们是否可以

通过添加宏定义,然后能够捕获到内存在哪里,被分配,在那里没有被释放,查看最多的内存

分配的函数,然后找到相关的解决方案。


遇到的问题1

RtNavi.exe 中的 0x75fcc42d 处最可能的异常: Microsoft C++ 异常: 内存位置 0x0018fdb0 处的 std::bad_alloc。

程序“[6328] RtNavi.exe: 本机”已退出,返回值为 -1 (0xffffffff)。

我在代码中不断申请内存,导致了内存耗尽,出现程序退出的情况,但是只是出现了程序执行的地址,并没有找到

对应的文件名称以及行号。



出现内存不足的情况,肯定是在哪一个函数,这个函数必须是不断重复申请,才导致了内存不足,不会是一个遍地开花的

局面,按照正常的原理,我们也可以轻松的定位到当前的哪一个正在执行的功能模块会导致内存不足,所以,对于

内存不足的情况,不足为虑,而是我们在使用的过程中,并没有发现什么有效的方法,从而导致了即使出现问题,我们也无法

判断问题的所在。


  #include   <crtdbg.h>

_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); 

Retrieves or modifies the state of the _crtDbgFlag flag to control the allocation behavior of the debug heap manager (debug version only).  

获取或者修改_crtDgbFlag的状态,都能够控制调试模式下的堆分配的行为

_CrtSetDbgFlag函数允许应用程序追踪堆管理器分配内存的所有行为,主要是通过修改_crtDbgFlag的标志位来实现的。


目前我们寻找的不是一个调试模式下的内存泄露,而是一个发布模式下的内存泄露,从而我们不能够通过添加任何的

DEBUG宏定义来解决我们手头上的问题,并且即使是在桌面版本上,我们也无法获取到所有的源代码进行编译,尝试

注定我们需要找到其他的工具进行新的尝试。



The _CrtSetDbgFlag function allows the application to control how the debug heap manager tracks memory allocations by modifying the bit fields of the _crtDbgFlag flag. By setting the bits (turning on), the application can instruct the debug heap manager to perform special debugging operations, including checking for memory leaks when the application exits and reporting if any are found, simulating low-memory conditions by specifying that freed memory blocks should remain in the heap's linked list, and verifying the integrity of the heap by inspecting each memory block at every allocation request. When _DEBUG is not defined, calls to _CrtSetDbgFlag are removed during preprocessing.


摘自:http://blog.sina.com.cn/s/blog_51396f890100qjyc.html


你可能感兴趣的:(leakmemory)