2014-01-18 90 views
1

我使用WMISMBios得到一些硬件信息清除創建的對象存儲

檢查uSMBios.pas

我不想用戶看到什麼是在內存中使用的序列號,所以我試圖清除它

,當我在記憶在許多地方調用

SMBios:=TSMBios.Create; 
//my code 
SMBios.free; 

的SMBIOS對象仍

我想這代碼上Destroy Event

if Assigned(FRawSMBIOSData.SMBIOSTableData) then 
    begin 
     ZeroMemory(FRawSMBIOSData.SMBIOSTableData,FRawSMBIOSData.Length); 
     FreeMem(FRawSMBIOSData.SMBIOSTableData); 
    end; 

GetSystemFirmwareTable API代碼SMBIOS偉大的工作,但在WMI它刪除某些記憶,但我仍然可以找到幾個街區

爲什麼調用對象後想.free或freeandnil使用過的內存未發佈

任何想法如何強制應用程序釋放它?

+3

你在做什麼是正確的。當你免費撥打電話時,德爾福電話只需撥打Freemem即可。它不會將內存清零。你最好的選擇是使用/修改內存管理器來包含這種行爲。 – whosrdaddy

+5

隨着['FastMM'(http://sourceforge.net/projects/fastmm/)你可以設置'{$定義AlwaysClearFreedMemory}'選項來清除釋放的內存。它雖然帶來了性能。 –

+0

感謝whosrdaddy和LU RD,我會盡量FastMM –

回答

5

內存被釋放,它只是沒有被擦除。你可能會誤解兩個概念:內存被綁定到某個所有者,並且不能被賦予另一個所有者,並且內存被清除了所有的信息。

看,當你走過新鮮的雪或沙灘時,你將腳步留在你身後。你搬走了,所以你經歷過的地方現在是免費的,任何人都可以佔領。但你的腳步留在那裏,直到有人用自己的腳印覆蓋他們。

現在,你可能是偏執狂,在每一步之後,你會回頭,拿一把刷子,並刪除你的新腳步。這是可能的,也許是有道理的,但它可能會非常緩慢。

某些對象可能會處理敏感數據,例如密碼,密碼鍵,批量計算中的個人數據等。對於這些對象來說,有偏執的感覺並刷出每一條痕跡。因此,這些對象的寫入方式可以擦除上次使用後不再需要的內存。並在析構函數中再次執行。

但是,當您剛剛關閉窗體並顯示「文件已成功保存」的信息時,並沒有任何值得一提的祕密。這是該計劃的大部分。

所以,現在請確定你是否真的有一些敏感的數據,如密碼。如果你這樣做 - 你的代碼應該在釋放之前用不同的數據覆蓋它。而且您必須瞭解在Delphi中如何爲不同類型保存數據,因此在處理這些數據時不會在其他地方複製數據。但很可能你不需要實際銷燬的數據,你只需要標記「這個地方是免費的,任何人都可以將他們的數據放在我的垃圾上」,這就是Delphi上釋放對象實際上所做的。如果這對於你來說就足夠了,你就不用花費時間去清理數據(這是用垃圾代替垃圾,而是垃圾)。

現在,關於LU RD和whosrdaddy的建議幾句話。是的,Delphi爲您提供了一種方法,可以在管理堆的方式上進行操作,並在免費標記公寓前明確清除垃圾數據。然而,這只是敏感數據的部分解決方案。

  • 99.9%的時間你會清理不值得的數據。字符串,動態數組,TList和其他容器會很慢 - 而且你的程序也是如此。
  • 你的應用程序由具有局部變量的過程組成。這些變量中的很多變量,如短字符串,固定大小的數組,GUID都是在堆棧中而不是在堆中分配的。這些建議不會清除它們,只有免費。
  • 你的對象通常在Delphi堆中分配內存。但他們也可能會分配它。在Windows堆,在一些多線程感知池,或其他。該內存不會被修改,從而修改默認的Delphi堆管理器行爲。

整體而言,這是同樣的想法。你的程序或你的對象知道哪些數據是危險的,以及它保存在哪裏 - 該對象或程序負責清理。全球德爾福規模解決方案既無效又不可靠。