gpt4 book ai didi

delphi - 这里有内存泄漏吗?

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

这段代码不会发生内存泄漏吗?

s := TStringList.Create; // create  first object
try
// Here line comes that seems to be dangerous
s := GetSomeSettings; // Overrides reference to first object by second one
finally
s.free; // Destroying only second object, leave first object to live somewhere in memory
end;


function GetSomeSettings : TStringList;
var
rawString : string;
settings : TStringList;
begin
// Singleton pattern implementation

// Trying to find already existing settings in class variable
settings := TSettingsClass.fSettings;

// If there is no already defined settings then get them
if not Assigned(settings) then
begin
GetSettingsInDB(rawString);
TSettingsClass.fSettings := ParseSettingsString(rawString);
settings := TSettingsClass.fSettings;
end;
Result := settings;
end;

我想知道 s := GetSomeSettings; 可能有害并忽略第一个对象,将其保留在内存中?

最佳答案

是的,第 1 行创建的 StringList 已泄漏。

本质上,你正在做:

s := TStringList.Create;
s := AnotherStringList;
AnotherStringList.Free;
<小时/>

至于GetSomeSettings例程:

通常,将新创建的实例作为函数结果返回是不明智的或不鼓励的,因为您将所有权和销毁的责任转移给了调用代码。除非您有一个适当的机制/框架来处理它,您的 TSettingsClass 似乎就是这种情况,但在这段小代码中没有足够的证据证明这一点。

然而,这两段代码的组合显示了另一个问题:在s.Free之后,TSettingsClass.fSettings被销毁,但不是nil。因此,第二次调用 GetSomeSettings 时,它返回一个悬空指针。

关于delphi - 这里有内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19649764/

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