?? readme.txt
字號:
內 存 防 護 系 統 說 明
YZ yzfree@yeah.net
版權所有 (C) 2001 VCHelp coPathway ISee workgroup.
1、引言
------------------------------------------------------------------------
對于一個經常使用C++或C語言的程序員來說,最令人頭疼的一個問題就是那些
莫名其妙的內存泄漏,以及內存訪問異常。作為一個職業程序員是決不應該允
許這樣的程序被發布出去的,我們需要盡早的將問題解決掉。但如果我們只使
用編譯器自帶的調試軟件查找問題的話,可能需要花費很多的時間和精力(而
且這也是一件非常枯燥的工作,沒有人愿意干),工作效率是很低下的。
為了解決這個問題,已有不少廠商推出了自己的內存檢測軟件,這些軟件可以
讓我們快速的找到引發問題的代碼。不過這里有個問題,就是一般這類的軟件
要價都比較狠,個人或者是小公司是承擔不起的。
為此,我編寫了這個內存防護系統。它可以有效的防止內存泄漏的發生,并且
可以幫助程序員時刻檢查內存的當前狀況,而且它還會適時的通知程序員引發
問題的原因(精確到具體的代碼行)。雖然這個系統現在還無法與同類型的商
業軟件相比,但對于個人、小公司、或是對內存檢測有特殊要求的人來說還是
會非常有用的。
我開發這套系統的目的是想將它應用于ISee組的圖象讀寫模塊,以期盡早的排
除各種潛在的內存操作錯誤。這套系統現在還處于雛形階段,所以我希望如果
哪位朋友有什么好的建議,請與我聯系,這也是我發布這個系統的初衷。我的
聯系地址是:
yzfree@yeah.net
當然,如果你有什么問題也可以向我發信詢問。
2、防護系統原理
------------------------------------------------------------------------
一般情況下,編譯軟件對用戶申請的內存塊并不提供過多的保護,請看下面的
例子:
void foo()
{
char *p = (char*)malloc(32);
}
函數foo()被調用之后,它里面申請的內存塊隨之“漂浮”了。程序結束之后,
編譯器的調試信息窗口只會告訴你有一個內存泄漏發生,并打出它的首地址。
這些信息不是很直觀,實用價值也不大,因為我們需要手工去查找這塊內存是
由誰分配的,如果你的程序比較大的話,這簡直就是一種折磨:)
我們再來看看下面這段程序會造成什么后果:
char *p = (char*)malloc(32);
memset(p, 0, 100);
哦!你猜對了,它會讓你的軟件崩潰。而且每次崩潰的時間和地點都可能不同
(因為每次運行軟件時,內存 p 后面的內容都可能不同)。這時編譯器的調試
窗口中不會給出任何有價值的提示信息。
如果此時我們不采用任何輔助系統的話,那么我們對這一類潛在的危險將束手
無策,我們只能被動的等待錯誤發生。
為了解決上面的問題,防護系統采用了對每個內存塊進行跟蹤和記日志的方法
,也就是說用戶在申請一塊內存的同時,防護系統會再申請一塊內存用于記錄
和跟蹤用戶內存(稱為內存信息塊)的運行狀態。當程序結束時,如果用戶忘
了釋放某塊內存,那么防護系統將根據對應的內存信息塊通知用戶有某塊內存
沒有被釋放,并打出分配這塊內存的代碼行號。這樣我們就可以迅速的找到引
發泄漏的原因。
另外,防護系統在申請用戶內存時,會增大這塊內存的尺寸,并在內存的首尾
添加防溢出標志,如果用戶在寫某塊內存時越界的話,那么防護系統將準確的
報告出是哪一塊內存被寫越界了。
最后,防護系統還具備檢查程序中那些引用已釋放內存的BUG,防護系統在申請
和釋放用戶內存時都會向內存中填充一些“廢料”信息,這些信息對于程序來
說通常都是沒有任何意義的,如果程序引用這些已釋放內存中的數據,那么程
序員可以立即發覺這個錯誤。
這就是防護系統現在所具有的功能,我相信這個系統的功能還是可以擴充的。
3、應用方法
------------------------------------------------------------------------
* 將isemem.h、isemem.cpp拷入你的項目目錄
* 將這兩個文件加入你的項目
* 將isemem.h加入到你的StdAfx.h中
* 在InitInstance()函數首部加入ise_open_mem_sys()函數
* 在ExitInstance()函數首部加入ise_close_mem_sys()函數
* 用防護系統接口函數 ise_malloc() 取代所有的內存分配函數
* 用防護系統接口函數 ise_realloc() 取代所有的內存重分配函數
* 用防護系統接口函數 ise_free() 取代所有的內存釋放函數
* 在內存操作集中的區域適時的使用 ise_check_mem_sys()、ise_help_me_sure()、
ise_check_pointer()、和ise_put_pointer_info() 函數(見源碼中的注釋)
4、發布版注釋
------------------------------------------------------------------------
防護系統的所有代碼都只在程序的調試版中有效,如果以發布版編譯使用了防
護系統的軟件,所有的防護系統函數都會自動消失。所以這個系統在發布狀態
下不會對宿主程序的性能有任何影響。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -