Pytanie o wskaźniki(zmienna lokalna) i pamięć

0

Cześć, robię następującą rzecz:

procedure MojaProcedura;
var
  wsk: PMojTyp;
begin
  new(wsk);
  wsk.pole1:=....;
  wsk.pole2:=....;

  List.Add(wsk);
end;

PMojTyp to oczywiście wskaźnik na MojTyp(PMojTyp = ^TMojTyp)

List to TList.

I teraz pytanie jest następujące. Nigdzie nie zwalniam przydzielonej pamięci wskaźnikowi wsk.
Robię to dlatego, żebym później mógł korzystać z tych danych.

Czy przez to mogą się tworzyć jakieś memory leaki albo inne niepożądane efekty? Co się dzieje z tą pamięcią?

0

Nie tylko mogą, ale na pewno się stworzą. Teoretycznie system operacyjny przy zamykaniu procesu powinien zwolnić po nim całą zarezerwowaną pamięć, ale z założenia nic nie daje Ci takiej gwarancji.

Na końcu programu (lub gdy już nie potrzebujesz tej pamięci) wykonaj coś w stylu:

while (List.Count>0) do
  begin
  Dispose(PMojTyp(List[0]));
  List.Delete(0);
  end;
0

W TObjectList zwalnianiem pamięci z Data zajmuje się chyba sama klasa... Wystarczy więc wtedy wywołanie metody Clear(), tak mi się wydaje :)
Jeśli musi to być TList, to nadpisz destruktor swoim destruktorem, aby zwalniał przydzieloną pamięć.

0

W TObjectList przechowuje się referencje obiektów, a nie wskaźniki (co pokazano w pierwszym poście). Z kolei w TList metoda Clear usuwa wskaźniki - elementy listy, ale nie zwalnia pamięci, na którą wskazują te wskaźniki.

0

Więc może lepiej przerób ten rekord na klasę i napisz dla niej destruktor. Metoda Clear() wywoła destruktor dla każdego obiektu, który jest elementem TObjectList.

1 użytkowników online, w tym zalogowanych: 0, gości: 1