这段代码对内存泄漏安全吗?

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时,它将返回一个悬空指针。

08-06 08:16