【问题标题】:Does the Assign method of TStringList copy the list of strings from source to destination, or does it simply copy the pointers?TStringList 的 Assign 方法是将字符串列表从源复制到目标,还是只是复制指针?
【发布时间】:2021-11-13 04:05:00
【问题描述】:

我对@9​​87654321@ 方法文档的模糊术语感到困惑。

中的“定”字

如果 Source 是 TStringList 类型,则列表设置为源 TStringList 对象的列表,如果支持关联对象,则复制所有关联对象 也来自 Source。

可以用多种方式解释。 TStringList 对象是从源复制到目标,而源保持不变......还是目标设置为指向到源对象而不复制任何内容?后者的含义是,如果我随后释放目标对象,则源对象也被释放。还是?

TStrings.AddObject 文档中的这条语句,即字符串添加到目的地的方式,对我来说更加混乱:

注意:TStrings 对象不拥有您以这种方式添加的对象。即使TStrings 实例被销毁,添加到TStrings 对象的对象仍然存在。它们必须由应用程序显式销毁。

这是否意味着我必须做的不仅仅是调用.Free 来销毁目的地TStringList 完成后?

【问题讨论】:

  • 这是一个副本。您可以更改或释放其中一个而不影响另一个。
  • 是的,任何相关的对象都是你的责任。在 Delphi 中,对象变量(如 x: TButton)只是对堆对象的引用。
  • 那我有一个不同的问题。我有一个访问冲突,只有当我自己运行 Mac 应用程序而不是从 IDE 运行时才会发生,所以我无法调试它!
  • 我们无法帮助您解决我们看不到的问题。向我们展示您的代码。
  • @nolaspeaker 如果调试器没有显示错误,那么我不知道代码中的哪个位置发生了这种情况。我取出了 Assign 语句,因为我意识到我不需要中间步骤来提取值。我可以直接从 TObjectDictionary 中获取它们。运行时错误仍然存​​在,但在调试器运行时仍然不会发生,只有当我独立运行应用程序时才会发生。

标签: delphi assign tstringlist


【解决方案1】:

你可以认为Assign是这样实现的:

PROCEDURE TStrings.Assign(Source : TStrings);
  VAR
    I : INTEGER;

  BEGIN
    Clear;
    FOR I:=0 TO PRED(Source.Count) DO AddObject(Source.Items[I],Source.Items.Objects[I])
  END;

实际的幕后实现可能会有所不同,但从外面看,这是Assign方法的逻辑操作。

(每个字符串的附加对象被复制为引用,因此它们指向与源中相同的实例)

【讨论】:

    【解决方案2】:

    TStringList.Assign() 复制来自源TStringList 的字符串和对象指针。只需知道这是浅拷贝而不是深拷贝,因为 string 是引用计数类型。

    【讨论】:

    • 字符串写入时复制意味着它的行为就像是深拷贝一样
    猜你喜欢
    • 1970-01-01
    • 2011-11-01
    • 2017-11-17
    • 2014-02-14
    • 2013-03-24
    • 2022-01-20
    • 2010-09-27
    • 2015-01-17
    • 2018-09-25
    相关资源
    最近更新 更多