vld 記憶體洩露檢測工具vld的實現

2021-07-04 23:29:20 字數 2321 閱讀 4375

初識visual leak detector

靈活自由是c/c++語言的一大特色,而這也為c/c++程式設計師出了乙個難題。當程式越來越複雜時,記憶體的管理也會變得越加複雜,稍有不慎就會出現記憶體問題。記憶體洩漏是最常見的記憶體問題之一。記憶體洩漏如果不是很嚴重,在短時間內對程式不會有太大的影響,這也使得記憶體洩漏問題有很強的隱蔽性,不容易被發現。然而不管記憶體洩漏多麼輕微,當程式長時間執行時,其破壞力是驚人的,從效能下降到記憶體耗盡,甚至會影響到其他程式的正常執行。

下面的**是vld工具的實現,首先說一下記憶體檢測的思路:

首先自己實現new或new時,並不是開闢使用者所要求的空間大小,而是開闢乙個節點,該節點大小為乙個meminfoblock結構的大小 + 使用者實際需要的大小。  開闢成功之後,把該節點鏈結到hash()函式所對映到phashtable陣列的某乙個下標之下; 當釋放某個指標時,從相應的phashtable下標下釋放儲存該位址記錄的節點,從而完成記憶體的釋放。

下面這幅圖是整個程式對申請記憶體的管理模式:

下面是vld.h檔案的實現

#pragma once

#include#include#include#define p 10 // 雜湊表預設表長

#define sizetype size_t // 值型別

typedef struct meminfoblock

meminfoblock;

void check_vld(); //先宣告函式

class checkmem

} }if(1 == flag)

printf("\nwarning: visual leak detector detected %d memory leaks!\n",count);

else

printf("\nno memory lacked dectected!\n");

}/*過載new, 可以實現對動態開闢的物件(或變數)空間申請*/

void* operator new(size_t sz,char *filename, int line)

else //陣列phashtable下標為index的值不空,說明該元素下有申請記錄

result = p+1; //指標p加1,不多說。實際返回值是申請記錄中不曾使用的那塊記憶體

return result;

}/*過載delete, 可以實現對動態開闢的物件(或變數)空間釋放*/

void operator delete(void *ptr)

else

else //通過對映找了一遍,但沒找到,說明ptr是非法位址

abort(); }}

/*過載new, 可以實現對動態開闢的陣列的空間申請*/

/*與new大同小異, 只是在new後面加了一對,不再重複解釋 */

void* operator new(size_t sz,char *filename, int line)

else

result = p+1;

return result;

}/*過載delete, 可以實現對動態開闢的陣列的空間釋放*/

/*與delete大同小異, 只是在delete後面加了一對,不再重複解釋 */

void operator delete(void *ptr)

else

else //通過對映找了一遍,但沒找到,說明ptr是非法位址

abort(); }}

下面是測試程式main.cpp#include"vld.h"

using namespace std;

#define new new(__file__,__line__)

class test

~test()

private:

char *pc;

};void main()

下面是程式執行的截圖:

好了,現在可以使用自己實現的記憶體檢測工具了

Visual C 記憶體洩露檢測工具(VLD)

c c 程式越複雜,記憶體的管理顯得越重要,稍有不慎就會出現洩漏。如果記憶體洩漏不是很嚴重,在短時間內對程式不會有太大影響,這也使得記憶體洩漏問題有很強的隱蔽性,不易被發現。然而不管記憶體洩漏多麼輕微,當程式長時間執行時,其破壞力是驚人的 從效能下降到記憶體耗盡,甚至會影響其他程式的正常執行。更多參...

記憶體洩露檢測 VLD工具

一 vld工具概述 visual leak detector vld 是一款用於visual c 的免費的記憶體洩露檢測工具。他的特點有 可以得到記憶體洩漏點的呼叫堆疊,如果可以的話,還可以得到其所在檔案及行號 可以得到洩露記憶體的完整資料 可以設定記憶體洩露報告的級別 並且是開源免費的。三 vld...

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

有乙個很著名的記憶體洩露檢測工具visual leak detected想必大家都不陌生,但今天我們可以自己寫乙個簡易版的。哈哈,自己動手,豐衣足食有木有!它的原理就是我們過載了操作符new和delete,當用new開闢空間的時候,就講這塊空間串到我們定義的結構體memnode形成的鍊錶中,這是老師...