【问题标题】:Destructor class in TObject and NIL Delphi again [duplicate]TObject和NIL Delphi中的析构函数类再次[重复]
【发布时间】:2012-03-18 17:17:28
【问题描述】:

可能重复:
Destructor class in TObject and NIL Delphi

我还有一个问题要找你们

我有一门课

当我按下 Button1 时,它正在执行下一个代码

    var a,b:TA;
begin
    a:=Ta.Create;
    b:=a;
    a.i:=30;

    FreeAndNil(a);

    if (a = NIL) then ShowMessage("a is nil");
    if (b=NIL) then ShowMessage("b is nil");

end;

两个实例都被破坏了机器人,只有一个是 NIL。我将如何写以知道 b 是否为空(已销毁)。我应该如何更改代码以便它应该写给我

a is nil
b is nil

所以我的问题是我应该如何知道指针 B 的位置是否是一个被破坏的实例

【问题讨论】:

  • 不,不是。这是不同类型的问题
  • 近距离投票的解释:欺骗问题中a 变量的规则也适用于您的b 变量。抱歉,但这真的不是魔术,也不是很难理解。再想一想 2 秒。
  • 我在问,在另一个变量 A(具有相同的指针)释放该对象之后,如何知道变量 B(来自指针的位置)的内容是否空闲(什么都没有,未分配)
  • @user558126,这里有一篇关于指针的好文章Addressing pointers
  • 你明白我的问题了吗?

标签: delphi oop class memory


【解决方案1】:

你可以声明b: Ta absolute a;
这允许您指示编译器将 b 变量视为存在于同一内存位置,从而有效地将一个变量叠加在另一个之上。

procedure TForm1.Button1Click(Sender: TObject);
var a: Ta;
    b: Ta absolute a;
begin
  a := Ta.Create;
  b := a;
  a.i := 1;
  FreeAndNil(a);
  if (a = NIL) then ShowMessage('a is nil');
  if (b = NIL) then ShowMessage('b is nil');
end;

这是一篇有用的文章:Absolute (for) Beginners

【讨论】:

  • 这很有趣,但是问题中的情况如何,两个不同的变量引用指向同一个对象。
  • @DavidHeffernan,b 的引用没有改变,每个都有自己的内存位置。这是一个很好的article 关于绝对指令。
  • 如何 b 必须保存一个传递的对象可以来自不同的来源和不同的类型?
  • @Kobik 我对绝对值非常熟悉。其实你的描述是错误的。有两个名称绑定到该引用的单个引用。但有趣的问题是,当你有两个不同的引用时会发生什么。那是指向一个共同指针的两个指针。 absolute 指令与此无关。
  • @DavidHeffernan,感谢您指出这一点。
【解决方案2】:

引用my previous answer:

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

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

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

这些相同的规则适用于您的 b 变量:

b 指向一个对象,你释放了这个对象,你没有触及b 的值,所以b 仍然指向一个曾经是Ta 对象的内存地址。

使用FreeAndNil(a) 你破坏了a 指向的对象,你取消了a。在此期间,b 指向的对象被销毁,但b 的值仍然保持不变。

解决方案:

FreeAndNil(a);
b := nil;

作为比较:

向一个随机城市发射一枚核弹,然后惊讶地发现这座城市仍然存在于您的地球上。如果地球没有更新,旅行者怎么会知道他的目的地不存在?

【讨论】:

  • 所以你无法验证指针 B(与 A 相同)的内容是否存在?我想从 A 中释放对象,我想从 B 中知道对象是否空闲
  • 是的!测试指针是否指向现有对象是不可能的。
  • b:=a;免费; // 如果 IS A DESTROYED then show('yes a'); 它将从内存中破坏我的对象如果 IS B 被破坏,则显示('yes b');它应该写两条消息,所以你不能
  • A 和 B 被破坏。它们指向的对象是!
  • 确实,不可能有这样的功能。您必须自己管理变量。
猜你喜欢
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 2017-01-21
  • 2013-09-06
  • 2012-12-09
  • 1970-01-01
相关资源
最近更新 更多