free是标记指针指向的内存空间现在处于可用状态,并不是对指针本身的值做任何的改变.
如果你的函数用在对内存空间要求很低(有很大内存)的程序上,或者程序执行的时间不长(在
程序执行的时候有足够的内存可用,不会消耗光),而且是单线程的(不会并发访问),那么简单
的解决方案是在unit中
var AList :TList
nCounter :Integer
.....
procedure XGetMem(var p
ointer;size:Integer)
begin
GetMem(p,size)
aList.Add(p)
end;
....
function callee
Char
var yourstr:string
// which one you want return it's content to caller
begin
yourstr := 'God it is too bad'
try
XGetMem(result,length(yourstr)+1)
// use XGetMem instead of default one
except
result := nil
end
if assigned(result) then begin
StrPLCopy(result,yourstr,length(yourstr))
result[length(yourstr)] := #0;
end
end
....
....
....
initialization
AList:=TList.Create
// corrected it,
finalization
while nCounter < AList.Count do
begin
freemem(aList.Items[nCounter])
inc(nCounter)
end;
AList.Clear
AList.Free
end.
这是最傻的方法,呵呵.更好的解法应该和gc(garbage collection)有关了,高性能的gc不是我们
这里能搞清楚的吧.