C语言中的内存检测宏。调试malloc
glib提供了一些检测malloc内存泄漏的函数例如:
1. mtrace(), muntrace() 并与MALLOC_TRACE环境变量进行配合,该环境变量定义了跟踪信息将要写入的文件名称。
使用mtrace()函数首先会检查是否定义了写入信息的文件位置。若已经正确设置了MALLOC_TRACE中的文件位置,则后续所有调用malloc函数是信息会被记录到改文件中。
但由于mtrace()所产生的文件可读性极差,还需要使用一个叫mtrace的工具来分析所产生的文件
2. mcheck() 与mprobe()函数,他们允许程序来检测所分配的内存块。 使用该函数需要连接mcheck库,加上在编译时加上 -lmcheck编译选项。
3. MALLOC_CHECK_ 环境变量提供了跟mcheck与mprobe函数类似的功能,但是他不需要重新编译与连接程序。
设置为0:忽略错误。 1:打印诊断信息。 2:调用abort()来终止程序
参考以下blog:
https://www.cnblogs.com/arnoldlu/p/10827884.html
还有一些其他的调试用的库例如:
Electric Fence(http://www.perens.com/FreeSoftware/)
dmalloc(http://dmalloc.com/)
Valgrind(http://valgrind.org)
Insure++(http://www.parasoft.com/)
---------------------------------
C++中使用的内存检测宏(Windows下)
尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询。
运行一下代码
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif
int main(int argc, char* argv[])
{
char* p = new char();
char* pp = new char[10];
char* ppp = (char*)malloc(10);
_CrtDumpMemoryLeaks();
return 0;
}
运行以后控制台会显示一下信息,会检测出内存泄漏
Detected memory leaks!
Dumping objects ->
c:\users\leonjo\documents\visual studio 2015\projects\consoleapplication1\
consoleapplication1\consoleapplication1.cpp(20) : {67} normal block at 0x00590C88, 10 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD
c:\users\leonjo\documents\visual studio 2015\projects\consoleapplication1\
consoleapplication1\consoleapplication1.cpp(19) : {66} client block at 0x00590C50, subtype 0, 10 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD
c:\users\leonjo\documents\visual studio 2015\projects\consoleapplication1\
consoleapplication1\consoleapplication1.cpp(18) : {65} client block at 0x0058E8A0, subtype 0, 1 bytes long.
Data: < > 00
Object dump complete.
The program '[3068] ConsoleApplication1.exe