天天看點

一個小問題引發的論證思考

    今天,有一個朋友,問了俺一個莫名其妙的問題,問的俺是一愣一愣的,搞了半天愣是沒搞明白。他提問的原話是:

<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 &lt;&gt; 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>&lt;pre</code><code>class</code><code>="brush:delphi"&gt;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>&lt;/pre&gt;</code>

<code>通過這個反彙編,我們就能明白為啥無論一個對象是否為</code><code>nil</code><code>都會執行了,主要的就是在釋放的時候會先判斷一下自身是否為空,不為空的時候才會執行釋放操作&lt;br data-filtered="filtered"&gt;&lt;br data-filtered="filtered"&gt;是以,建議大家在這種情況下,先将以後要判斷的對象初始化為</code><code>nil</code><code>,如果不初始化的話,系統配置設定給對象變量一個不為</code><code>nil</code><code>的壞指針,那樣後面的判斷就失效了,我想我朋友估計&lt;br data-filtered="filtered"&gt;也是忽略了這一點吧!&lt;br data-filtered="filtered"&gt;</code>

本文轉自 不得閑 部落格園部落格,原文連結: http://www.cnblogs.com/DxSoft/archive/2010/05/17/1737116.html ,如需轉載請自行聯系原作者

繼續閱讀