delphi – 为什么Assigned对未初始化的变量返回true?

我在论坛上阅读了很多关于指针,分配函数,自由函数,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;在第一行进入上面的程序一切正常……它显示’未分配’和’已分配’.

为什么??

有没有什么安全的方法可以知道类变量是否已经执行了create方法

解决方法

您的变量是局部变量,因此未初始化.它可以包含任何值.

documentation说:

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?

如果该变量是局部变量,则答案为否.程序员有责任落在你身上.在实践中,它很少成为问题,因为良好的代码具有较短的程序,这使得您更难以滑倒.即使你这样做,编译器也会一直警告你.

其他类型的变量(如类字段和全局变量)已初始化.

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...