当内存分配数不总是相同时如何检测内存泄漏?
How to detect memory leak when memory allocation number isn't always same?
我的程序出现了这样的内存泄漏(55 字节)。
我正在使用 C++、MFC、Visual Studio 2010.
检测到内存泄漏!
{13497} 0x0E44C248 处的正常块,55 字节长。
数据:44 3A 5C 46 44 41 53....
问题是,内存分配编号“13497”并不总是相同。如果我再次 运行 程序,它总是不同的数字。
我想找到我在退出前没有释放内存的地方,用_crtBreakAlloc,但似乎不可能在内存分配号上中断。
我也使用了_CrtSetDbgFlag和_CrtDumpMemoryLeaks,但也没有很好地工作。
在这种情况下有什么方法可以检测内存泄漏吗?
谢谢。
嗯,有几种方法可以解决这个问题。
- 查看数据转储以查找您可能认识的任何类型的字符串。这可能会帮助您找到它。
- 在内存分配上放置一个条件断点,仅当请求(或分配)的大小为 55 字节时才会中断。
- 您可能会通过在 header 中尽早放置这样的内容来获得更好的结果,您的所有代码都包含(例如 stdafx.h)
此代码重新映射运算符 new
#ifdef _DEBUG
# define _CRTDBG_MAP_ALLOC
# include <crtdbg.h>
# include <new>
# include <memory>
# define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
# define new DEBUG_NEW
#endif
- 此外,泄漏的内存量是否会随着您 run/use 您的应用程序的增加而增加?如果不是,它可能根本就不是泄漏。有时您会收到有关静态分配 objects 的泄漏报告。至少,仔细看看你所做的静态分配
您可以使用像 cppcheck 这样的静态分析器,或者如 Joe 所说,重新映射运算符 new
。
我开发了一些您可以使用的内存泄漏实用程序:
https://github.com/check69/Utils/blob/master/leaks.cpp
https://github.com/check69/Utils/blob/master/leaks.h
有一些 visual studio 指令可以获取控制台输出中的漏洞,以便于调试。
PS: 我会把这个作为评论放在joe post,但是我需要50分才能发表评论。
您好,感谢您的回答..
我使用 https://vld.codeplex.com/ 中的 "Visual Leak detector" 很容易找到泄漏位置
我强烈推荐这个给那些有同样问题的人。
:) 您可以下载它并将其放入您的项目中。
我的程序出现了这样的内存泄漏(55 字节)。 我正在使用 C++、MFC、Visual Studio 2010.
检测到内存泄漏! {13497} 0x0E44C248 处的正常块,55 字节长。 数据:44 3A 5C 46 44 41 53....
问题是,内存分配编号“13497”并不总是相同。如果我再次 运行 程序,它总是不同的数字。 我想找到我在退出前没有释放内存的地方,用_crtBreakAlloc,但似乎不可能在内存分配号上中断。 我也使用了_CrtSetDbgFlag和_CrtDumpMemoryLeaks,但也没有很好地工作。
在这种情况下有什么方法可以检测内存泄漏吗?
谢谢。
嗯,有几种方法可以解决这个问题。
- 查看数据转储以查找您可能认识的任何类型的字符串。这可能会帮助您找到它。
- 在内存分配上放置一个条件断点,仅当请求(或分配)的大小为 55 字节时才会中断。
- 您可能会通过在 header 中尽早放置这样的内容来获得更好的结果,您的所有代码都包含(例如 stdafx.h)
此代码重新映射运算符 new
#ifdef _DEBUG
# define _CRTDBG_MAP_ALLOC
# include <crtdbg.h>
# include <new>
# include <memory>
# define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
# define new DEBUG_NEW
#endif
- 此外,泄漏的内存量是否会随着您 run/use 您的应用程序的增加而增加?如果不是,它可能根本就不是泄漏。有时您会收到有关静态分配 objects 的泄漏报告。至少,仔细看看你所做的静态分配
您可以使用像 cppcheck 这样的静态分析器,或者如 Joe 所说,重新映射运算符 new
。
我开发了一些您可以使用的内存泄漏实用程序:
https://github.com/check69/Utils/blob/master/leaks.cpp
https://github.com/check69/Utils/blob/master/leaks.h
有一些 visual studio 指令可以获取控制台输出中的漏洞,以便于调试。
PS: 我会把这个作为评论放在joe post,但是我需要50分才能发表评论。
您好,感谢您的回答..
我使用 https://vld.codeplex.com/ 中的 "Visual Leak detector" 很容易找到泄漏位置 我强烈推荐这个给那些有同样问题的人。 :) 您可以下载它并将其放入您的项目中。