首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测/避免(非托管)代码中的内存泄漏?

如何检测/避免(非托管)代码中的内存泄漏?
EN

Stack Overflow用户
提问于 2008-09-05 12:18:01
回答 23查看 163K关注 0票数 125

在非托管C/C++代码中,检测内存泄漏的最佳实践是什么?以及要避免的编码指南?(好像事情就是这么简单;)

我们在过去使用了一种有点愚蠢的方式:每次内存分配调用都有一个计数器递增,并在释放时递减。在程序结束时,计数器值应为零。

我知道这不是一个很好的方法,但也有一些问题。(例如,如果您正在释放由平台API调用分配的内存,则您的分配计数将与您的释放计数不完全匹配。当然,当调用分配内存的API调用时,我们会递增计数器。)

我期待着你的经验,建议,也许还有一些可以简化这一点的工具的参考。

EN

回答 23

Stack Overflow用户

发布于 2008-09-05 12:22:55

如果你的C/C++代码可以移植到*nix,那么没有什么比Valgrind更好的了。

票数 79
EN

Stack Overflow用户

发布于 2008-09-08 16:30:58

如果您使用的是Visual Studio,Microsoft提供了一些用于检测和调试内存泄漏的有用函数。

我将从这篇文章开始:https://msdn.microsoft.com/en-us/library/x98tx3cf(v=vs.140).aspx

以下是这些文章的快速摘要。首先,包含以下标头:

代码语言:javascript
复制
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

然后,您需要在程序退出时调用以下代码:

代码语言:javascript
复制
_CrtDumpMemoryLeaks();

或者,如果您的程序不是每次都在同一位置退出,您可以在程序开始时调用以下代码:

代码语言:javascript
复制
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

现在,当程序退出时,所有不是空闲的分配都将在输出窗口中打印出来,以及它们被分配到的文件和分配的发生。

此策略适用于大多数程序。然而,在某些情况下,这会变得困难或不可能。使用在启动时执行一些初始化的第三方库可能会导致其他对象出现在内存转储中,并使追踪泄漏变得困难。此外,如果您的任何类具有与任何内存分配例程(如malloc )同名的成员,则CRT调试宏将导致问题。

在上面引用的MSDN链接中解释的其他技术也可以使用。

票数 65
EN

Stack Overflow用户

发布于 2008-09-05 14:38:16

在C++中:使用RAII。像std::unique_ptrstd::shared_ptrstd::weak_ptr这样的智能指针是你的朋友。

票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档