【问题标题】:Destructor class in TObject and NIL DelphiTObject 和 NIL Delphi 中的析构函数类
【发布时间】:2012-04-02 23:24:03
【问题描述】:

我想知道为什么在我调用Free 方法后对象不是nil
我的意思例如下一节课:

type Ta = class(TObject)
public
  i: integer;
  destructor Destroy; override;
end;

destructor Ta.Destroy;
begin
  inherited;
end;

procedure Form1.Button1;
var a: Ta;
begin
  a := Ta.Create;       
  a.Free;

  if a = nil then
    button1.Caption := 'is assigned' 
  else 
    button1.caption := 'is not assigned';
end;

我的问题是为什么释放对象后不是 nil 以及如何在不使用 a := nil 的情况下在析构函数后将 a 变为 nil

【问题讨论】:

  • 释放对象不会将其设置为零。使用 FreeAndNil(a)
  • 你不能用析构函数来实现吗?
  • 非常感谢您的快速响应!
  • 如果我释放一个对象并在下一个源代码行中使用它,编译器应该会给我一些新鲜的咖啡:)
  • @user558126,对对象实例的任何引用(可能有很多)对于析构函数都是陌生的。因此,在您销毁一个对象后,所有引用都将变得无效,并且您可以响应将它们重置为零。例如:如果你和另一个 var a1: Ta 并复制指针 a1 := a 在你调用 FreeAndNil(a) 后它将变成一个悬空的指针

标签: delphi memory free destructor


【解决方案1】:

说明:

变量a只有在赋值nil时才会变成nil。这意味着代码中需要有a := nil,但现在缺少了。

Free 是只是一种方法,作用于Ta 类的一个实例。 Free 会破坏a 指向的那个实例。 a 仍然相同,现在指向一个曾经是 Ta 实例的内存地址。

解决方案:

使用FreeAndNil(a)可以同时销毁变量指向的对象,同时清除变量。

【讨论】:

    【解决方案2】:

    实例方法不能修改调用该方法的实例变量。这是因为方法被传递了实例变量的副本(隐式 Self 参数),而不是传递到实例变量的引用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2013-03-22
      • 2016-12-27
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多