天天看点

谨防数组函数返回值造成的内存泄露

数组作为函数返回值时,非常容易引起内存泄露。

问题现象: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;

  arrTest: array[0..15] of byte;

  str: string;

  str := '1239582692918232';

  StrToPByte(str, arrText);  

//正确用法(用局部变量引用,才能保证被Delphi释放)

  pTest: PByte;

  pTest := StrToPByte(str, arrText);