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

标签 delphi variables pointers null

我在论坛上读了很多关于指针、Assigned 函数、Free 函数、FreeAndNil 函数等的帖子...我已经知道 Free函数不会删除对分配的对象的指针引用,而 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.

请注意,作为实现细节,某些类型是托管的,甚至托管类型的局部变量也会被初始化。托管类型的示例包括:字符串、接口(interface)、动态数组、匿名类型和变体。

你问:

Is there any safe way to know if a class variable already has its create method executed?

如果该变量是局部变量,则答案是否定的。这个责任就落到了程序员的身上。在实践中,这很少是一个问题,因为好的代码具有简短的过程,这使得您更难出错。即使您这样做,编译器也会总是警告您。

其他类型的变量(例如类字段和全局变量)被初始化。

关于delphi - 为什么Assigned 对于未初始化的变量返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21168998/

相关文章:

java - 为什么我会收到意外的类型、需要变量错误?即使我使用变量

c - 使用指针数组进行交换

javascript - Delphi 欢迎页面不会加载菜单

delphi - list 和 GetVersionEx

variables - 如何在用户定义的字符类中插入变量?

c++ - 什么时候引用变量合适,为什么?你能解释一下实际的语法和位置吗?

pointers - 为什么 http.Client{} 的前缀是 &?

c++ - static_cast/dynamic_cast : Does it change the object?

delphi - Delphi 10.3 中使用 HTTPRIO 进行基本身份验证

c++ - 将 Delphi 类传递给需要具有 __thiscall 方法的类的 C++ 函数/方法