如何检测/避免(非托管)代码中的内存泄漏?
在非托管C / C ++代码中,检测内存泄漏的最佳实践是什么? 和编码准则,以避免? (就好像它很简单;)
过去我们使用了一些愚蠢的方法:每次分配内存时调用计数器增量,并在释放时减少。 在程序结束时,计数器值应该为零。
我知道这不是一个好方法,并且有几个捕获点。 (例如,如果您释放由平台API调用分配的内存,则您的分配计数将不会与您的空闲计数完全匹配。当然,当调用分配内存的API调用时,我们会增加计数器。)
我期待着你的经验,建议和可能的一些工具简化这个参考。
如果你的C / C ++代码可以移植到* nix,那么很少有东西比Valgrind更好。
如果您使用的是Visual Studio,Microsoft提供了一些有用的功能来检测和调试内存泄漏。
我将从这篇文章开始:https://msdn.microsoft.com/en-us/library/x98tx3cf(v=vs.140).aspx
以下是这些文章的简要摘要。 首先,包含这些标题:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
然后你需要在程序退出时调用它:
_CrtDumpMemoryLeaks();
或者,如果您的程序没有每次都在同一个地方退出,您可以在程序开始时调用它:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
现在,当程序退出时,所有未被释放的分配将被打印在输出窗口中,以及它们被分配到的文件和分配事件。
该策略适用于大多数程序。 但是,在某些情况下变得困难或不可能。 使用在启动时进行一些初始化的第三方库可能会导致其他对象出现在内存转储中,并且难以追踪您的泄漏。 此外,如果您的任何类具有与任何内存分配例程(例如malloc)相同名称的成员,CRT调试宏将导致问题。
在上面引用的MSDN链接中还有其他一些技术可以使用。
在C ++中:使用RAII。 像std :: unique_ptr,std :: shared_ptr,std :: weak_ptr这样的智能指针是你的朋友。
链接地址: http://www.djcxy.com/p/35045.html上一篇: How do you detect/avoid Memory leaks in your (Unmanaged) code?