1.
根據(jù)
Delphi
指令參考手冊(cè)中
說(shuō)明:
Assigned
函式在參數(shù)不為
nil
時(shí)傳回
True,
表示指針已經(jīng)指到某個(gè)內(nèi)存地址,這個(gè)內(nèi)存地址可能是一個(gè)對(duì)象地首地址,也可能在函數(shù)或過(guò)程中,聲明一個(gè)指針變量,沒(méi)有賦值為
nil
,無(wú)亂的指向某處,這兩個(gè)種情況,
Assigned
(指針變量)都不為
nil ,
函數(shù)放回
True
;
而參數(shù)為
nil
時(shí)則傳回
False
。
Assigned
并不是一個(gè)真正的函數(shù)。
技巧:
用呼叫
Assigned
的方式來(lái)取代直接把參數(shù)拿來(lái)和
nil
比較,效率會(huì)更好。
2.
這個(gè)問(wèn)題要從內(nèi)存方面來(lái)解釋
當(dāng)你建構(gòu)一個(gè)物件
SomeComponet.Create(Owner);
系統(tǒng)會(huì)有一個(gè)指針指向這個(gè)對(duì)象
當(dāng)你解構(gòu)一個(gè)物件
SomeComponet.Free;
系統(tǒng)會(huì)將指針指到的東西殺掉,但是指標(biāo)還是指在相同的位置
請(qǐng)注意計(jì)算機(jī)的資源是有限的,
所以可能下一步你的程序要跟系統(tǒng)要資源,
剛才的指針位置,就出現(xiàn)了其它的數(shù)據(jù)
If Assigned(SomeComponet) then SomeComponet := nil;
先檢查這個(gè)對(duì)象有沒(méi)有在其它地方被設(shè)成
nil
,
然后再將它設(shè)成
nil
。
當(dāng)我們無(wú)法預(yù)測(cè)使用者會(huì)如何操爆他的計(jì)算機(jī),
程序員必須留意內(nèi)存的管理。
小弟淺見(jiàn)
...
3
function Assigned(var P): Boolean;
Description
Use Assigned to determine whether the pointer or procedure referenced by P is nil. P must be a variable reference of a pointer or procedural type. Assigned(P) corresponds to the test P<> nil for a pointer variable, and @P <> nil for a procedural variable.
Assigned returns False if P is nil, True otherwise.
檢查指針指向的參考變量或過(guò)程是否為
nil
每次我通常的處理方法都是:
if assigned(frm) then frm.close;??
但是當(dāng)下次調(diào)用時(shí)就會(huì)出錯(cuò)。為什么呢,直到咋天我才知道原因
frm.close;frm.free;
只是指定這塊內(nèi)存可以重寫(xiě),并未釋放為
NIL
因此當(dāng)下次調(diào)用時(shí)即使
frm.free
已經(jīng)
執(zhí)行過(guò)
assigned(frm)
仍為
TRUE
,再次釋放
frm.Close
或者
frm.free
肯定會(huì)報(bào)錯(cuò);應(yīng)為
frm.Close
或
frm.free
是釋放
對(duì)象指針
frm
指向的內(nèi)存空間,在上次已經(jīng)釋放調(diào)了,但是
frm
本身并沒(méi)有
初始化為
nil ,
相反它還是指向被釋放的內(nèi)存地址;東西已經(jīng)沒(méi)有了,沒(méi)有地東西去釋放,不報(bào)錯(cuò)錯(cuò)才怪。
正確的處理方法:
if assigned(frm) then
begin
?? frm.close;
?? frm:=nil;
end;
或
:
if assigned(frm) then
begin
frm.close;
freeandnil(frm);
end;
//
可以測(cè)試一些就能真正理解
FreeAndNil
和
Assigned
函數(shù)地使用方法了;
procedure FreeAndNil(var Obj);
Description
Use FreeAndNil to ensure that a variable is nil after you free the object it references. Pass any variable that represents an object as the Obj parameter.
var P: Pointer;
begin
P := nil;
if Assigned (P) then Writeln ('You won''t see this');
GetMem(P, 1024); {P valid}
FreeMem(P, 1024); {P no longer valid and still not nil}
if Assigned (P) then Writeln ('You''ll see this');
end;