動的配列でメモリリークを防ぐには?


ERです  2005-06-14 02:00:44  No: 15609

動的配列で指定した所だけを削除したのですがメモリが開放されていません。
割り当てられたメモリを開放しメモリリークを防ぐにはどのようにすればよいですか?配列名 := nil; では動的配列すべてが無くなりますので指定した場所だけを
メモリリークから防ぎたいと思っています。皆さん宜しくお願いいたします。


大豆くん  2005-06-14 03:52:03  No: 15610

var
  A: array of Integer;
begin
  SetLength(A, 1);

  A[0] := 1;
   Edit1.Text  :=
     Format('A Size:%d  A[0]=%d',[Length(A),A[0]]);

  SetLength(A, 0);
end;
とかのことでしょうか?

漏れている最小限のコードを提示しないと誰もわからないと思います


大豆くん  2005-06-14 03:56:36  No: 15611

中級者以上向けの関数には
procedure Move(const Source; var Dest; Count: Integer);
というのがあります。
メモリを手前に移動して
配列を短くするといいです。

初心者には難しいのでお勧めしません。

動的配列より
メモリ確保して
TListに確保して保存する方が楽だと思います。
解放もコードで簡単でできますし。


ERです  2005-06-14 04:58:55  No: 15612

少し記述します。
var Array: Array of String;
begin
  Array[1] := 'aaa';


ERです  2005-06-14 05:03:04  No: 15613

少し記述します。
type
  aRecord = record
    ID: Integer;
    Name: String;
var 
  Array: Array of aRecord;
begin
  Array[1].ID := '001';    
  Array[1].Name := 'aaa';
  Array[2].ID := '002';    
  Array[2].Name := 'bbb';
  Array[3].ID := '003';    
  Array[3].Name := 'ccc';

でこの場合の、 Array[2].ID := '002'; だけを削除してメモリを開放したい
と思っています。


にしの  2005-06-14 05:34:11  No: 15614

Integerには'001'は入らないですよね :)
それと、予約語を変数名にすると後々見づらくなります。
# IDEでメッセージのトラップするとmessageって予約語を引数にしてしまうのですが^^;

では本題。
SetLengthのほうがメモリ確保・解放が楽なのですが、移動は不便です。
TListにしたほうが簡単ですね。

var
  List: TList;
  rec: PRecord;
  i: integer;
begin
  List := TList.Create;
  New(rec);
  rec.ID := 1;
  rec.Name := 'aaa';
  List.Add(rec);
  New(rec);
  rec.ID := 2;
  rec.Name := 'bbb';
  List.Add(rec);
  New(rec);
  rec.ID := 3;
  rec.Name := 'ccc';
  List.Add(rec);

  List.Delete(1);
  for i := 0 to List.Count - 1 do
  begin
    Memo1.Lines.Add(IntToStr(PRecord(List[i])^.Id) + ':' + PRecord(List[i])^.Name);
  end;

  for i := 0 to List.Count - 1 do
  begin
    Dispose(List[i]);
  end;
  List.Free;

end;


ERです  2005-06-14 05:40:48  No: 15615

ありがとうございます。
動的配列でDisposeのようなものはないのですか?


にしの  2005-06-14 06:16:13  No: 15616

SetLength(動的配列, 0);
で、Disposeされませんでしたっけ?

探してみたら、動的配列の要素削除のサンプルありました。
http://forum.nifty.com/fdelphi/samples/00653.html
http://forum.nifty.com/fdelphi/samples/00655.html
こっちでも簡単そうですね。


Syake  2005-06-14 17:14:14  No: 15617

>動的配列でDisposeのようなものはないのですか?
あなたは、既に知っている。
>配列名 := nil; では動的配列すべてが無くなりますので・・・
そのまんま。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加