gpt4 book ai didi

delphi - 我必须释放使用 SysAllocString 分配的 BSTR (WideString) 吗?

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

我有这个代码(我需要将字符串对象添加到 TStringList):

var
WS: WideString;
begin
WS := 'allocated string';
SL.AddObject('my string', TObject(SysAllocString(PWideChar(WS))));

稍后阅读:

var
WS: WideString;
begin
WS := PWideChar(SL.Objects[0]);
ShowMessage(WS);

我想知道系统是否会处理分配有 SysAllocString 的 BSTR 。或者我必须调用 SysFreeString 吗?文档中并不清楚。

现在,如果系统确实解除了它的分配,有什么方法可以证明它确实解除了分配吗?

附注:事实上,调用就足够了:

SL.AddObject('my string', TObject(PWideChar(WS)));

不使用SysAllocString。 (我不明白它是如何工作的)

最佳答案

下面的行确实分配了一个新的 BSTR 并将其指针填充到 SL.Objects[] 指针。

  SL.AddObject('my string', TObject(SysAllocString(PWideChar(WS))));

因此以下明确地泄漏内存:

var
WS: WideString;
begin
WS := PWideChar(SL.Objects[0]);

这里将分配一个 WS 实例,因此 SL.Objects[0] 指向的 BSTR 实例将不会被释放。

以下内容是偶然起作用的:

SL.AddObject('my string', TObject(PWideChar(WS)));

PWideChar(WS) 内存缓冲区指向的内存仍包含先前的 WS: WideString 实例。所以这可能会起作用...直到缓冲区被重新使用并被其他一些数据覆盖,并且返回另一个文本,或者发生随机 GPF。

建议:永远不要欺骗 Delphi 类型系统,将 TObject 以外的东西存储在类型为 TObject 的变量中...除非您知道自己在做什么。在您了解指针是什么以及它们如何工作之前,请勿使用指针。

我没有看到在 TStrings.Object[] 条目中存储 WideString 有任何好处!更改您的数据结构:创建一个真正的,存储您的字符串。那么一切都会清晰干净:

type
TMyStoreWS = class
protected
fText: WideString;
public
constructor Create(const aText: WideString); virtual;
property Text: WideString read fText write fText;
end;

constructor TMyStoreWS.Create(const aText: WideString);
begin
inherited Create;
fText := aText;
end;

...
SL.AddObject('my string', TMyStoreWS.Create(aText)); // clean
...
ShowMessage(SL.Objects[0].Text); // clean
SL.Objects[0].Free; // don't forget to release

我可以告诉您,对于 BSTR 字符串分配来说,分配 class 实例的小开销可以忽略不计。而且您的代码肯定会更干净、更容易维护/发展。

关于delphi - 我必须释放使用 SysAllocString 分配的 BSTR (WideString) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37910079/

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