gpt4 book ai didi

Delphi:从什么时候开始,接口(interface)引用不再在 with block 末尾释放?

转载 作者:行者123 更新时间:2023-12-03 15:15:26 24 4
gpt4 key购买 nike

我最近偶然发现了一个由我编写的一些非常旧的代码引起的问题,这些代码显然假设 with 语句中使用的接口(interface)引用将在 with 后立即释放>-block 被保留 - 有点像隐式的 try-finally-block(如果我理解正确的话,类似于 C# 的 using-语句)。

显然(在 Delphi 2009 中)情况并非如此(不再?)。有谁知道这是什么时候发生的?或者我的代码一开始就是完全错误的?

为了澄清这一点,这里有一个简化的示例:

type
IMyIntf = interface;
TSomeObject = class(TInterfacedObject, IMyIntf)
protected
constructor Create; override; // creates some sort of context
destructor Destroy; override; // cleans up the context created in Create
public
class function GetMyIntf: IMyIntf; //a factory method, calling the constructor
end;

procedure TestIt;
begin
DoSomething;
with (TSomeObject.GetMyIntf) do
begin
DoStuff;
DoMoreStuff;
end; // <- expected: TSomeObject gets destroyed because its ref.count is decreased to 0
DoSomethingElse;
end; // <- this is where TSomeObject.Destroy actually gets called

每当有人开始旧的“with是邪恶的”论点时,这总是我脑海中的一个例子,让我继续“是的,但是......”。看来我错了...有人能证实吗?

最佳答案

Pascal/Delphi 中的 with 保留字仅用于轻松访问记录或对象/类的成员(即,为了不提及记录/对象/类的名称)。它与与垃圾收集相关的 C# with 非常不同。自记录诞生之日起,它就存在于 Pascal 语言中,以简化对许多数据成员(当时简称为“字段”)的代码调用。

总而言之,with 与垃圾收集、内存释放或对象实例销毁无关。在 with header 中构造的对象之前可以在单独的代码行中初始化,这是一样的。

关于Delphi:从什么时候开始,接口(interface)引用不再在 with block 末尾释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1233773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com