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