我在论坛上阅读了很多关于指针,分配函数,自由函数,FreeAndNil函数等的帖子……我已经知道自由函数不会删除指向对象的指针引用而且FreeAndNil会这样做…我读过的所有帖子都是对待的考虑到Create方法已经被执行,或者换句话说,考虑已经创建的对象.
我的问题是:为什么Assigned函数对未初始化的对象变量返回true?@H_502_3@
举个例子:@H_502_3@
procedure TForm1.FormCreate(Sender: TObject); var Qry: TADOQuery; begin if Assigned(Qry) then ShowMessage('Assigned') else ShowMessage('Unassigned'); Qry := TADOQuery.Create(nil); if Assigned(Qry) then ShowMessage('Assigned') else ShowMessage('Unassigned'); end;
结论:在声明Qry之后,在执行create方法之前,Qry的指针不是NIL!@H_502_3@
如果我把Qry:= nil;在第一行进入上面的程序一切正常……它显示’未分配’和’已分配’.@H_502_3@
为什么??@H_502_3@
解决方法
您的变量是局部变量,因此未初始化.它可以包含任何值.
documentation说:@H_502_3@
On the Win32 platform,the contents of
a local variable are undefined until a value is assigned to
them.@H_502_3@
请注意,作为实现细节,管理某些类型,甚至初始化托管类型的局部变量.托管类型的示例包括:字符串,接口,动态数组,匿名类型和变体.@H_502_3@
你问:@H_502_3@
Is there any safe way to know if a class variable already has its create method executed?@H_502_3@
如果该变量是局部变量,则答案为否.程序员有责任落在你身上.在实践中,它很少成为问题,因为良好的代码具有较短的程序,这使得您更难以滑倒.即使你这样做,编译器也会一直警告你.@H_502_3@