1.
根據
Delphi
指令參考手冊中
說明:
Assigned
函式在參數不為
nil
時傳回
True,
表示指針已經指到某個內存地址,這個內存地址可能是一個對象地首地址,也可能在函數或過程中,聲明一個指針變量,沒有賦值為
nil
,無亂的指向某處,這兩個種情況,
Assigned
(指針變量)都不為
nil ,
函數放回
True
;
而參數為
nil
時則傳回
False
。
Assigned
并不是一個真正的函數。
技巧:
用呼叫
Assigned
的方式來取代直接把參數拿來和
nil
比較,效率會更好。
2.
這個問題要從內存方面來解釋
當你建構一個物件
SomeComponet.Create(Owner);
系統會有一個指針指向這個對象
當你解構一個物件
SomeComponet.Free;
系統會將指針指到的東西殺掉,但是指標還是指在相同的位置
請注意計算機的資源是有限的,
所以可能下一步你的程序要跟系統要資源,
剛才的指針位置,就出現了其它的數據
If Assigned(SomeComponet) then SomeComponet := nil;
先檢查這個對象有沒有在其它地方被設成
nil
,
然后再將它設成
nil
。
當我們無法預測使用者會如何操爆他的計算機,
程序員必須留意內存的管理。
小弟淺見
...
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.
檢查指針指向的參考變量或過程是否為
nil
每次我通常的處理方法都是:
if assigned(frm) then frm.close;??
但是當下次調用時就會出錯。為什么呢,直到咋天我才知道原因
frm.close;frm.free;
只是指定這塊內存可以重寫,并未釋放為
NIL
因此當下次調用時即使
frm.free
已經
執行過
assigned(frm)
仍為
TRUE
,再次釋放
frm.Close
或者
frm.free
肯定會報錯;應為
frm.Close
或
frm.free
是釋放
對象指針
frm
指向的內存空間,在上次已經釋放調了,但是
frm
本身并沒有
初始化為
nil ,
相反它還是指向被釋放的內存地址;東西已經沒有了,沒有地東西去釋放,不報錯錯才怪。
正確的處理方法:
if assigned(frm) then
begin
?? frm.close;
?? frm:=nil;
end;
或
:
if assigned(frm) then
begin
frm.close;
freeandnil(frm);
end;
//
可以測試一些就能真正理解
FreeAndNil
和
Assigned
函數地使用方法了;
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;