gpt4 book ai didi

Delphi 通过引用或值/复制传递参数

转载 作者:行者123 更新时间:2023-12-03 14:40:36 28 4
gpt4 key购买 nike

上下文1

var text:String;

text:='hello';

myFunc(text);

上下文2

function myFunc(mytext:String);
var textcopy:String;
begin

textcopy:=mytext;

end;
Context2 上的

myFunc 是从 Context1 调用的,局部变量 mytext 是否指向 Context2 外部的内存?或者 mytext 在作用域内有自己的内存空间,并用 text 的相同内容填充/复制?我可能错过了一些非常基本的东西,因为我收到了访问冲突错误。

有什么方法可以明确指定函数是否应该通过引用或通过值接收参数,然后像在 C 中那样进行复制?我不确定我是如何做到的。

最佳答案

Delphi 字符串的内存管理有点不寻常。调用 myFunc(text) 并分配 textcopy := mytext 后,所有三个变量 (text, mytexttextcopy) 将指向原始字符串的同一地址。

但是一旦您使用这些变量之一对字符串进行更改,Delphi 就会在幕后克隆该字符串,并将您的更改应用于副本。另外两个变量仍然指向原来的,所以它们保持不变。因此,上下文 2 中所做的任何更改都不会在上下文 1 中看到 - 这种“写时复制”机制有效地为您提供了按值传递语义。所有这些字符串都是引用计数的,一旦所有引用超出范围,就会自动释放。

但是,有一个异常(exception)。如果您使用指针而不是字符串操作来访问字符串,您将绕过复制步骤,并且您的更改将影响原始字符串。您还将绕过引用计数逻辑,并可能最终得到指向已释放内存块的指针。这可能是您的访问冲突背后的原因,但如果没有更多详细信息/更多代码,我无法说。

如果您想要引用传递,请将函数声明为 myFunc(var mytext: String)。如果你想强制Delphi复制字符串,而不是等到它被修改,你可以使用 System.UniqueString .

关于Delphi 通过引用或值/复制传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9543472/

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