函数返回的是TStringList类型的变量,我这样写的代码:
result:=tstringlist.Create;
result.add('sdafdsf');
函数里面没有机会free.会不会造成内存泄漏?
result:=tstringlist.Create;
result.add('sdafdsf');
函数里面没有机会free.会不会造成内存泄漏?
解决方案 »
- ExpressVerticalGrid 组件中的 TcxRTTIInspector 如何编辑多个控件的属性
- 如何截获其他程序按钮点击消息?
- 关于shellexecute
- 请大家帮忙看看是什么错误,谢谢了!
- 如何把scktsrvr.exe 服务添加到 我系统里的服务里面 可以自动启动
- 一个线程问题
- delphi 如何结束受 hook API 保护的进程
- 如何修改DBNavigator中删除数据时出“delete record?”改为中文“要删除这条记录吗”。。。。
- 班竹:我的一个帖子:关于ClientDataSet SQL动态参数的问题?(zengyixun)很有意思的请帮我一下!谢谢!
- dbgrid中各字段显示问题
- adsl拨号上网时都发送哪些协议数据包
- 【原创】介绍SmartPrinter(虚拟打印机)
不过最好写上
result.free;这样程序安全
还有最好用try
finally
finally
result.free;
这样不管怎样对象都会被释放掉
var
temp:string;
i:integer;
begin
result:=tstringlist.Create;
temp:=source;
i:=pos(ch,source);
while i<>0 do
begin
result.Add(copy(temp,0,i-1));
delete(temp,1,i);
i:=pos(ch,temp);
end;
result.Add(temp);
end;
应该是这样:
fucntion CreateList:TStrings;
begin
result:=TStringList.Create;
//你的代码
end;而在调用的时候:
var
slTmp:TStrings;
begin
slTmp:=CreateList;
//你的代码
slTmp.Free;
end;也就是说,在函数中显式创建类。在调用过程中不显式创建,但是显试释放。
一个函数最好一个功能,如果功能比较大,可以设计成类。
类中提供创建,增加,等操作的方法。
SplitString(const source, ch: string): tstringlist;
exu(大脸猫) 说的好像有道理。不过我也觉得这个函数很危险。另外那位朋友能提供一个比较安全点的字符串分离函数?
这里的result是一个指向tstringlist内存对象的指针,如果不free肯定有内存泄露用参数方式处理
procedure test(a:tstringlist)
var
temp:string;
i:integer;
begin
应该先判断一下a是否已经分配内存
a.clear;
temp:=source;
i:=pos(ch,source);
while i<>0 do
begin
a.Add(copy(temp,0,i-1));
delete(temp,1,i);
i:=pos(ch,temp);
end;
end;
begin
result:=TStringList.Create;
//你的代码
end;而在调用的时候也可以:
with CreateList do
begin
try
//你的代码
finally
Free;
end;
end;
end;
创建者负责释放。
以前我也写过类似的代码,但现在我再也不写那样的代码了。为什么不把调用函数及该函数调整一下呢?procedure DoSomething(slList: TStrings);
begin
//你的代码
end;而在调用的时候也可以:
var
aList: TStrings;
begin
...
aList := TStringList.Create;
try
DoSomething(aList);
finally
aList.Free;
end;
...
end;
procedure DoSomething(s1,s2:string,var slList: TStrings);
begin
//我的代码
end;
我把那个slList参数前加了个var这样可以传址了,在调用函数处继续使用。这样那个slList函数里面就没有creat,free了。
如果你在函数中释放是不对的
你可以先传入一个类
处理完成后在释放
不必要用var的
类的变量就是一个指针了