動的配列で指定した所だけを削除したのですがメモリが開放されていません。
割り当てられたメモリを開放しメモリリークを防ぐにはどのようにすればよいですか?配列名 := nil; では動的配列すべてが無くなりますので指定した場所だけを
メモリリークから防ぎたいと思っています。皆さん宜しくお願いいたします。
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;
とかのことでしょうか?
漏れている最小限のコードを提示しないと誰もわからないと思います
中級者以上向けの関数には
procedure Move(const Source; var Dest; Count: Integer);
というのがあります。
メモリを手前に移動して
配列を短くするといいです。
初心者には難しいのでお勧めしません。
動的配列より
メモリ確保して
TListに確保して保存する方が楽だと思います。
解放もコードで簡単でできますし。
少し記述します。
var Array: Array of String;
begin
Array[1] := 'aaa';
少し記述します。
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'; だけを削除してメモリを開放したい
と思っています。
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;
ありがとうございます。
動的配列でDisposeのようなものはないのですか?
SetLength(動的配列, 0);
で、Disposeされませんでしたっけ?
探してみたら、動的配列の要素削除のサンプルありました。
http://forum.nifty.com/fdelphi/samples/00653.html
http://forum.nifty.com/fdelphi/samples/00655.html
こっちでも簡単そうですね。
>動的配列でDisposeのようなものはないのですか?
あなたは、既に知っている。
>配列名 := nil; では動的配列すべてが無くなりますので・・・
そのまんま。
ツイート | ![]() |