初識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形成的鍊錶中,這是老師...