有乙個很著名的記憶體洩露檢測工具visual leak detected想必大家都不陌生,但今天我們可以自己寫乙個簡易版的。哈哈,自己動手,豐衣足食有木有!!!
它的原理就是我們過載了操作符new和delete,當用new開闢空間的時候,就講這塊空間串到我們定義的結構體memnode形成的鍊錶中,(這是老師的寫法,在main程式結束時,用check_vld()函式檢測有沒有記憶體洩露)但我覺得,如果我們動態開闢了乙個物件,在它的析構函式裡用delete釋放的話,這種方法就不太可行。因為析構函式只有到return時才會被呼叫(在check_vld()函式之前)。檢測結果就不準確。由此我想到,可以將這個結構體該為c++中的類class memnode,並將其指標也封裝為乙個類pmemnode,然後定義乙個pmemnode的全域性靜態成員(它會在主函式之前被構造,主函式結束後析構)。並將check_vld()的**放在他的析構函式中。
廢話不多說,**在下面:
vld.h:
#pragma once
#include using namespace std;
class memnode
~memnode()
{} void set(int sz, char *pf, int l, class memnode *pl)
void setlink(memnode *pl)
int getsize()
char *getfile()
int getline()
memnode *getlink()
private:
int size;
char *file;
int line;
class memnode *link;
};void check_vld();
class pmemnode
~pmemnode()
memnode *getptr()
void setptr(memnode *ptr)
private:
memnode *p;
};static pmemnode _afxmem;
void* operator new(size_t sz,char *filename,int line)
else
result = _afxmem.getptr()+1;
return result;
}void operator delete(void *ptr)
if(ptr==null)
memnode *p;
if (_afxmem.getptr()+1 == ptr)
else
if (p->getlink() != null)
}}void check_vld()
else }
}
main.cpp:
#include #include #include "vld.h"
using namespace std;
class test
~test()
private:
char *ch;
int a;
double b;
char c;
};int main()
記憶體洩露檢測工具 valgrind
valgrind 安裝 2.解壓安裝包 tar jxvf valgrind 3.2.3.tar.bz2 3.解壓後生成目錄valgrind 3.2.3 4.cd valgrind 3.2.3 5.執行.autogen.sh設定環境 需要標準的autoconf工具 可選 6.configure 配置v...
Linux C記憶體洩露檢測工具
在linux下些c語言程式,最大的問題就是沒有乙個好的程式設計ide,當然想kdevelop等工具都相當的強大,但我還是習慣使用kdevelop工具,由於沒有乙個習慣的程式設計ide,記憶體檢測也就成了在linux下編寫程式的乙個大問題。是不是說沒有一種記憶體檢查工具能夠在linux使用呢,也不是,...
valgrind記憶體洩露檢測工具
一 安裝 valgrind linux環境首先進入root使用者 然後執行下面的命令 tar jxvf valgrind 3.12.0.tar.bz2 cd valgrind 3.12.0 configure make make install valgrind version 檢視valgrind...