自己實現簡易的記憶體洩露檢測工具VLD

2021-07-04 23:05:03 字數 1662 閱讀 2429

有乙個很著名的記憶體洩露檢測工具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...