Zwalnianie pamięci z klas i innych takich...

0

Witam, mam kilka pytań, więc od razu przejdę do rzeczy...

  1. Powiedzmy, że mam zdefiniowane takie oto klasy:
  TKlasa = class
  public
    Text: String;
  end;

  TInnaKlasa = class
  public
    Klasy: Array of TKlasa;
  end;

Jak widać TInnaKlasa zawiera dynamiczną tablicę składającą się z
TKlasa, a każda z nich posiada dynamiczną zmienną Text...

Powiedzmy, że teraz uruchomię to:

var
  InnaKlasa: TInnaKlasa;
begin
  InnaKlasa := TInnaKlasa.Create;
  SetLength(InnaKlasa.Klasy, 1);
  InnaKlasa.Klasy[0] := TKlasa.Create;
  InnaKlasa.Klasy[0].Text := 'DUPA';

No i teraz jak najbardziej poprawnie na świcie, żeby nie uronić ani
jednego bajtu, a jednocześnie najszybciej, zwolnić pamięć ze
zmiennej Text, klasy Klasy[0], tablicy Klasa oraz klasy InnaKlasa ?
Bo pewnie InnaKlasa.Free nie załatwi sprawy...

  1. Czym się w praktyce różni Dispose() od Finalize() ?

  2. Pomyślałem sobie, że jeśli constructor Create przydziela pamięć
    dla klasy to pewnie Free zwalnia wszystko pięknie tym czasem
    definicja Free w module System wygląda tak:

procedure TObject.Free;
begin
  if Self <> nil then Destroy;
end;

natomiast definicja Destroy wygląda jeszcze lepiej:

destructor TObject.Destroy;
begin
end;

O co tu biega, 1 Kwietnia czy co ?

0

ad 1.
Myślę, ze jedynym sensownym sposobem jest napisanie swojeo destruktora dla klasy InnaKlasa, ktory w pętli zwolni tablice obiektow.

0

ad 1.
Myślę, ze jedynym sensownym sposobem jest napisanie swojeo destruktora dla klasy InnaKlasa, ktory w pętli zwolni tablice obiektow.

Wnioskuje z odpowiedzi, że Destroy zwalnia tylko obiekt, natomiast
pola obiektu które wskazują na inne dynamiczne zmienne trzeba
zwolnić samemu...

Jeżeli tak to OK, mam jeszcze jedno pytanie, dosyć głupie:
Czy stringi w takim obiekcie (po użyciu Destroy) zwolnią się
same czy trzeba z nimi coś specjalnego robić ?
Może lepiej używać PChar żeby mieć pewność co się dzieje ?

0

Wnioskuje z odpowiedzi, że Destroy zwalnia tylko obiekt, natomiast
pola obiektu które wskazują na inne dynamiczne zmienne trzeba
zwolnić samemu...

Dokładnie

Jeżeli tak to OK, mam jeszcze jedno pytanie, dosyć głupie:
Czy stringi w takim obiekcie (po użyciu Destroy) zwolnią się
same czy trzeba z nimi coś specjalnego robić ?
Może lepiej używać PChar żeby mieć pewność co się dzieje ?

O typ string nie trzeba się martwić. Tym zajmuje się już Delphi

0

Ad.3. Free rózni się od Destroy tym, że wywołana po raz drugi nie powoduje wykrzaczenia się programu.

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