有没有办法做以下工作:
type List <T> = record private FList : TList <T>; FGuard : IInterface,procedure CheckCreated; public procedure Add(const Value : T); end;procedure List <T>.CheckCreated;beginif (FGuard = nil) then begin FList := TList <T>.Create; FGuard := TGuard.Create (FList); // guard calls free on List in destructor end;end;procedure List <T>.Add (const Value : T);beginCheckCreated;FList.Add (Value);end;
理想情况下我想像这样使用它:
function ReturnHandles : List <THandle>;beginResult.Add (2);Result.Add (3);end;
正如在链接问题的答案中所解释的那样,这不起作用(这实际上很棘手).它不会在每次调用时创建新列表.
不幸的是,这也不起作用:
function ReturnHandles : List <THandle>;beginInitialize (Result);Result.Add (2);Result.Add (3);end;
它会泄漏保护接口和所有列表,因为Initialize只会覆盖接口引用而不会减少引用计数.
有没有办法让这项工作?或者你会建议把它作为一个界面而不是记录,只是住在施工线上?
function ReturnHandles : List <THandle>;beginResult := List <T>.Create;Result.Add (2);Result.Add (3); end;
谢谢你的帮助!
解决方法 如果我理解正确,这应该可以正常工作:function ReturnHandles : List <THandle>;begin Finalize(Result); Result.Add (2); Result.Add (3);end;
Finalize调用将确保将所有托管类型设置为nil,我认为这是您的意图.
这个问题与您之前的问题密切相关,我认为您可以使用out参数来简化代码.函数结果隐式为var参数,但如果使用显式out参数,则会根据需要初始化托管类型.
procedure InitializeHandles(out Handles : List <THandle>);begin Handles.Add (2); Handles.Add (3);end;
就个人而言,既然你在混合中引入了一个接口,我想我会倾向于一路走下去并专门使用接口.或者使用标准类并接受try / finally生命周期管理的需要.
总结以上是内存溢出为你收集整理的delphi – 列出记录的实现全部内容,希望文章能够帮你解决delphi – 列出记录的实现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)