考虑以下代码:
procedure Test;
var
MyPCharArray: array of PChar;
begin
SetLength(MyPCharArray, 3);
GetMem(MyPCharArray[0], 5);
GetMem(MyPCharArray[1], 5);
GetMem(MyPCharArray[2], 5);
StrCopy(MyPCharArray[0], 'test');
StrCopy(MyPCharArray[1], 'abcd');
StrCopy(MyPCharArray[2], '1234');
// Are these necessary?
FreeMem(MyPCharArray[0], 5);
FreeMem(MyPCharArray[1], 5);
FreeMem(MyPCharArray[2], 5);
end;应该手动释放分配的元素,还是当MyPCharArray超出作用域时编译器会自动释放数组元素?
发布于 2013-01-05 17:08:50
实际上,您对GetMem的每个调用都必须与对FreeMem的调用相匹配。
我不知道你为什么会有这个数组。这不是我期望在纯Pascal代码中看到的类型。所以我的猜测是,您正在将PChar数组传递给某个外部库。在这种情况下,我将声明一个字符串数组以及PChar数组。然后使用PChar(...)创建每个PChar元素在字符串数组的相应元素上。这样你就可以避免使用StrCopy、GetMem和FreeMem。
procedure CallLib(const str: array of string);
var
i: Integer;
parr: array of PChar;
begin
SetLength(parr, Length(str));
for i := 0 to high(parr) do
parr[i] := PChar(str[i]);
// call library now
end;https://stackoverflow.com/questions/14170201
复制相似问题