gpt4 book ai didi

delphi - 为什么例程需要传递给它的 PChar(字符串类型转换)在返回后保留在内存中?

转载 作者:行者123 更新时间:2023-12-02 03:56:22 27 4
gpt4 key购买 nike

var
S: string;
begin
SetLength(S, MAX_SIZE);// when casting to a PChar, be sure the string is not empty
SetLength(S, GetModuleFilename(0, PChar(S), Length(S)));
// statements
end;

To eliminate the overhead of copying the buffer, you can cast the string to a PChar (if you are certain that the routine does not need the PChar to remain in memory). http://docwiki.embarcadero.com/RADStudio/en/Passing_a_Local_Variable_as_a_PChar

我们有一个字符串,它将保留在内存中,直到其引用计数递减到 0,因此它不会在作用域过程中被删除。那么,为什么我们需要 PChar 保留在内存中?是否有某些 API 函数需要与之前传递给另一个 API 函数的完全相同的 PChar 引用?

特别是我正在考虑示例代码。因此,问题一定是“为什么例程需要传递给它的 PChar(字符串类型转换)在返回后保留在内存中?”。异步 I/O 例程,或者在调用者返回后访问传递的 pchar 的异步方法,或者由另一个线程修改全局字符串都是很好的理由。

最佳答案

有时 API 会将指针存储到稍后的时间。例如,考虑异步 IO。

或者,如果您编写如下代码,它也会失败:

function Broken():PChar;
var s:string;
begin
s:=IntToStr(Random(100));//no string constant
return PChar(s);
end;

一个重要的一点是,如果您将 refcount>1 的字符串转换为 PChar,它将创建一个副本,然后向您提供一个 refcount=1 的字符串。因此,一旦您传入的 s 无效,即使它的 refcount>1,您的 PChar 也会变得无效。

另一个损坏的示例:

var p:PChar;
var s:string;

s := IntToStr(Random(100));//no string constant
p := PChar(s);
s := "ABC";
DoSomething(p);//p is invalid by now

关于delphi - 为什么例程需要传递给它的 PChar(字符串类型转换)在返回后保留在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9194769/

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