今天,有一個朋友,問了俺一個莫名其妙的問題,問的俺是一愣一愣的,搞了半天愣是沒搞明白。他提問的原話是:
<b>一檔案流沒有建立,怎麼判斷呢</b>
這個問題還真把我問倒了,我壓根就沒明白這是個啥意思,後來他說了半天之後,我還是沒明白是啥,最後他索性給了一個讓我郁悶了半天的代碼。如下:
<a></a>
var
Stream : TMemoryStream;
aSkinName : Pchar;
vStrings : TStrings;
begin
inherited;
vHandle := LoadLibrary(Pchar(Gv_SkinFile)); //動态載入DLL,并傳回其句柄
//Stream := TMemoryStream.Create;
try
if vHandle <> 0 then //
@GetSkin:=GetProcAddress(vHandle, 'GetSkin');
end;
if not (@GetSkin = nil) then
Stream := TMemoryStream.Create;
aSkinName := pchar(Gv_SkinName);
GetSkin(aSkinName,Stream);
with Unit_CommonDm.CommonDm.SkinData do
LoadFromStream(stream);
if not Active then Active := true;
end else
//RaiseLastWin32Error;
finally
FreeLibrary(vHandle); //調用完畢收回DLL占用的資源
stream := nil ;
if stream = nil then
stream.free;
然後反複強調了最後finally中的一段代碼
stream: TMemoryStream;
stream := TMemoryStream.Create;
stream.Size := 234;
stream := nil;
if stream = nil then
stream.Free;
這樣寫,居然不會出錯哦!那麼這個建立的TMemoryStream到底釋放了沒有呢?想都不用想,那是肯定沒釋放的,也就是說有記憶體洩露,不信的可以用FastMM檢視看。至于為
啥出錯,我們需要去看TObject的Destroy的代碼,這個在Delphi中式沒有實作的,我們在調試過程中打開Delphi的CPU調試視窗檢視一下彙編代碼
<code><pre</code><code>class</code><code>="brush:delphi">TObject</code><code>.</code><code>Free:</code>
<code>00403A00 85C0 test eax,eax</code><code>//這裡檢查了釋放的指針是否為nil</code>
<code>00403A02</code><code>7407</code> <code>jz</code><code>$00403a0b</code><code>//如果為nil向後跳7位元組,也就是直接跳到ret</code>
<code>00403A04 B201 mov dl,</code><code>$01</code>
<code>00403A06 8B08 mov ecx,[eax]</code>
<code>00403A08 FF51FC call dword ptr [ecx-</code><code>$04</code><code>]</code>
<code>00403A0B C3 ret</code>
<code></pre></code>
<code>通過這個反彙編,我們就能明白為啥無論一個對象是否為</code><code>nil</code><code>都會執行了,主要的就是在釋放的時候會先判斷一下自身是否為空,不為空的時候才會執行釋放操作<br data-filtered="filtered"><br data-filtered="filtered">是以,建議大家在這種情況下,先将以後要判斷的對象初始化為</code><code>nil</code><code>,如果不初始化的話,系統配置設定給對象變量一個不為</code><code>nil</code><code>的壞指針,那樣後面的判斷就失效了,我想我朋友估計<br data-filtered="filtered">也是忽略了這一點吧!<br data-filtered="filtered"></code>
本文轉自 不得閑 部落格園部落格,原文連結: http://www.cnblogs.com/DxSoft/archive/2010/05/17/1737116.html ,如需轉載請自行聯系原作者