数组作为函数返回值时,非常容易引起内存泄露。
问题现象:Build应用程序后,提示非法内存访问;可是Compile应用程序却没有这个问题。
问题思考:函数返回值,在被调用函数中负责释放;局部变量也是在函数调用结束后在函数内被释放。如果一个函数调用了另外一个函数,却没有使用被调用函数的返回值,就有可能造成内存泄露。
//数组作为函数返回值
function StrToPByte(Const str: string;Var arrByte: array of byte): PByte;
var
i: integer;
begin
for i := 0 to Length(str) do
begin
arrByte[i] := Byte(Char(str[i + 1]));
end;
Result := @arrByte;
end;
//错误用法
procedure Test;
var
arrTest: array[0..15] of byte;
str: string;
begin
str := '1239582692918232';
StrToPByte(str, arrText);
end;
//正确用法(用局部变量引用,才能保证被Delphi释放)
procedure Test;
var
arrTest: array[0..15] of byte;
pTest: PByte;
str: string;
begin
str := '1239582692918232';
pTest := StrToPByte(str, arrText);
end;