Delphi の record ポインタの Dispose で文字列が開放されない
Delphi の record ポインタの Dispose で文字列が開放されない
ListView Item の Data へポインタとしてレコード型を投入、OnDeletion で開放というコード
- type
- TItemRec = record
- Name, Value: string;
- end;
- PItemRec = ^TItemRec;
- var
- ItemRec: TItemRec;
- PItem: PItemRec;
- // 文字列投入
- ItemRec.Name := 'key';
- ItemRec.Value := 'val';
- New(PItem);
- PItem^ := ItemRec;
- ListItem := ListView1.Items.Add;
- ListItem.Data := PItem; // Dataへポインタを投入
- // リスト削除時に開放
- procedure TForm1.ListView1Deletion(Sender: TObject; Item: TListItem);
- begin
- if (Item.Data <> nil) then begin
- Dispose(Item.Data);
- end;
- end;
このコード、文字列2つが開放されない
Dispose で元のレコード型にキャストして開放すればよいらしい
- procedure TForm1.ListView1Deletion(Sender: TObject; Item: TListItem);
- begin
- if (Item.Data <> nil) then begin
- Dispose(PItemRec(Item.Data));
- end;
- end;
コメント