3

次のコードを検討してください。

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ありますか、それともスコープ外になったときにコンパイラが配列要素を自動的に解放しますか?

4

1 に答える 1

5

実際、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;
于 2013-01-05T09:08:50.297 に答える