如何从Delphi中的函数返回一个对象而不会导致访问冲突?
发布时间:2020-12-15 10:09:50 所属栏目:大数据 来源:网络整理
导读:我有一个delphi函数返回一个TStringList,但是当我返回一个值并尝试使用它时,我得到一个访问冲突错误,即 myStringList := FuncStringList();myStringList.Items.Count // -- This causes an access violation// function FuncStringListfunction FuncStringLi
我有一个delphi函数返回一个TStringList,但是当我返回一个值并尝试使用它时,我得到一个访问冲突错误,即
myStringList := FuncStringList(); myStringList.Items.Count // <-- This causes an access violation // function FuncStringList function FuncStringList:TStringList; var vStrList:TStringList; begin vStrList := TStringList.Create; ... // Fill the vStrList Result := vStrList vStrList.Free; //<- when i free here,this function will cause AccessViolation end; 如何返回TStringList并仍然在本地函数中释放它? 解决方法
当Smasher说,你不能释放它;调用返回对象的函数的代码负责销毁它.
这是错误的代码设计,顺便说一下,因为它使得混淆了谁分配和释放.一个更好的方法是让调用者创建对象并将其传递给函数.这样,创建它的代码也可以释放它.这样的事情 var SL: TStringList; begin SL := TStringList.Create; try ProcToFillStringList(SL); //Do something with populated list finally SL.Free; end; end; // Note I've made the parameter a TStrings and not a TStringList. This allows // passing a TMemo.Lines or a TListBox or TComboBox Items as well. procedure ProcToFillStringList(const SList: TStrings); // Do whatever populates the list with SList.Add() end; 现在不会有什么混乱的 – 创建对象的相同代码负责释放它.而代码,IMO,更清楚阅读和维护. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |