内存泄漏检测工具
检测已分配资源
第一个工具是一个内存资源使用的监听器.它只能在模拟器上进行调试.可以使用快捷键来调用
CTRL+ALT+SHIFT+A
显示已分配堆单元的数量
CTRL+ALT+SHIFT+B
显示已分配的文件服务器资源的数量
CTRL+ALT+SHIFT+C
显示已分配的窗口服务器资源的数量
堆检测宏
第二个工具可以在你指定的代码块中检测内存的分配情况.只需要把这些宏加入你要检测的代码部分即可:
宏
功能
__UHEAP_MARK
开始检测堆的使用状况
__UHEAP_CHECK(n)
检测自上一个__UHEAP_MARK是否有’n’个堆被分配(尚未释放)
__UHEAP_CHECKALL(n)
检测是否有’n’个堆已分配
__UHEAP_MARKEND
检测结束,并检测在__UHEAP_MARK之后有没有未被释放的堆
__UHEAP_MARKENDC(n)
检测结束,并检测在__UHEAP_MARK之后有无’n’个未被释放的堆
这是一个简单的使用示例
Code:
CMyClass * a1 =
new(ELeave)CMyClass;
...
__UHEAP_MARK; //开始检测
CMyClass * a2 =
new(ELeave)CMyClass;
CMyClass * a3 =
new(ELeave)CMyClass;
...
__UHEAP_CHECK(2); //检测在__UHEAP_MARK之后有2个堆单元被分测(a2,a3)
__UHEAP_CHECKALL(3); //检测三个堆已被分配(a1,a2,a3)
delete(a2);
__UHEAP_MARKEND; // 结束检测,a3内存泄露
如果想设计驱动程序或内核模块,你可以使用__KHEAP_***宏来检测内核堆.
分配失效工具
用来进行压力测试.你可以使用下列宏
宏
功能
__UHEAP_SETFAIL(aType, n)
可以根据参数的不同来指定下一个内存如何分配.
参数表如下:
EDeterministic:n个请求失败
ERandom:随机失败,n是随机数的种子
ETrueRandom:随机失败
__UHEAP_FAILNEXT(n)
引起下一分配失败
__UHEAP_RESET()
避免内存失败
也可以在模拟器中按CTRL+ALT+SHIFT+P和CTRL+ALT+SHIFT+Q来使用分配
没有及时释放堆上分配的对象,会造成内存泄露。
你可以参考这篇文章学习如何防止这种以外发生
http://www.newlc.com/Tracking-down-...che=memory+leak
另外在分配对象和释放对象时记录log是个好习惯,最后要匹配下是否分配和释放都能对应。