1.根据Delphi指令参考手册中

说明:
Assigned函式在参数不为nil时传回True,表示指针已经指到某个内存地址,这个内存地址可能是一个对象地首地址,也可能在函数或过程中,声明一个指针变量,没有赋值为nil,无乱的指向某处,这两个种情况,Assigned(指针变量)都不为nil,函数放回True;

而参数为nil时则传回False。


Assigned并不是一个真正的函数。

技巧:
用呼叫Assigned的方式来取代直接把参数拿来和nil比较,效率会更好。


2.这个问题要从内存方面来解释
当你建构一个物件SomeComponet.Create(Owner);
系统会有一个指针指向这个对象
当你解构一个物件SomeComponet.Free;
系统会将指针指到的东西杀掉,但是指标还是指在相同的位置
请注意计算机的资源是有限的,
所以可能下一步你的程序要跟系统要资源,
刚才的指针位置,就出现了其它的数据
IfAssigned(SomeComponet)thenSomeComponet:=nil;
先检查这个对象有没有在其它地方被设成nil,
然后再将它设成nil。

当我们无法预测使用者会如何操爆他的计算机,
程序员必须留意内存的管理。小弟浅见...


3
functionAssigned(varP):Boolean;

Description

UseAssignedtodeterminewhetherthepointerorprocedurereferencedbyPisnil.Pmustbeavariablereferenceofapointerorproceduraltype.Assigned(P)correspondstothetestP<>nilforapointervariable,and@P<>nilforaproceduralvariable.

AssignedreturnsFalseifPisnil,Trueotherwise.

检查指针指向的参考变量或过程是否为nil

每次我通常的处理方法都是:

ifassigned(frm)thenfrm.close;但是当下次调用时就会出错。为什么呢,直到咋天我才知道原因

frm.close;frm.free;只是指定这块内存可以重写,并未释放为NIL因此当下次调用时即使frm.free已经

执行过assigned(frm)仍为TRUE,再次释放frm.Close或者frm.free肯定会报错;应为frm.Close或frm.free是释放对象指针frm指向的内存空间,在上次已经释放调了,但是frm本身并没有初始化为nil,相反它还是指向被释放的内存地址;东西已经没有了,没有地东西去释放,不报错错才怪。

正确的处理方法:

ifassigned(frm)then
begin
frm.close;
frm:=nil;
end;

或:

ifassigned(frm)then
begin
frm.close;
freeandnil(frm);
end;


//可以测试一些就能真正理解FreeAndNil和Assigned函数地使用方法了;

procedureFreeAndNil(varObj);

Description

UseFreeAndNiltoensurethatavariableisnilafteryoufreetheobjectitreferences.PassanyvariablethatrepresentsanobjectastheObjparameter.

varP:Pointer;

begin
P:=nil;
ifAssigned(P)thenWriteln('Youwon''tseethis');
GetMem(P,1024);{Pvalid}
FreeMem(P,1024);{Pnolongervalidandstillnotnil}
ifAssigned(P)thenWriteln('You''llseethis');
end;

http://mopishv0.blog.163.com/blog/static/54455932201051644442662/