加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 这里有内存泄漏吗?

发布时间:2020-12-15 09:11:15 所属栏目:大数据 来源:网络整理
导读:这段代码是否可以防止内存泄漏? s := TStringList.Create; // create first objecttry // Here line comes that seems to be dangerous s := GetSomeSettings; // Overrides reference to first object by second onefinally s.free; // Destroying only se
这段代码是否可以防止内存泄漏?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读