Dodawanie obiektów do Listy i MemoryLeak

0

Mam taki oto kod w unicie:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TCustomer = class
    private
      CustomerName   : String;
      CustomerNumber : Integer;
    public
      property Name : String read CustomerName;
      property Number : Integer read CustomerNumber;

      constructor Create(const CustomerName   : String; const CustomerNumber : Integer);
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    myList : TList;
    procedure ShowListContents;
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


constructor TCustomer.Create(const CustomerName   : String; const CustomerNumber : Integer);
begin
  self.CustomerName   := CustomerName;
  self.CustomerNumber := CustomerNumber;
end;


procedure TForm1.ShowListContents;
var i : Integer;
begin
for i := 0 to myList.Count-1 do
  begin
        ShowMessage(TCustomer(myList[i]).Name+' is customer number '+ IntToStr(TCustomer(myList[i]).Number));
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  customer : TCustomer;

begin
  myList := TList.Create;

  customer := TCustomer.Create('Neil Moffatt', 123);
  myList.Add(customer);
  customer := TCustomer.Create('Bill Gates', 64);
  myList.Add(customer);

  myList.Add(TCustomer.Create('Henry Cooper', 999));
  myList.Add(TCustomer.Create('Alan Sugar', 2));

  myList.Insert(2, TCustomer.Create('Added as item 3', 33));
  myList.Delete(4);

  ShowListContents;

  myList.free;
end;

end.

W pliku projektu mam załączone pokazywanie wycieków pamięci

ReportMemoryLeaksOnShutdown := DebugHook <> 0;

Czy ktoś może mi wyjaśnić dla czego skąd biorą się wycieki pamięci.

Zmieniłem kod na poniższy:

procedure TForm1.FormCreate(Sender: TObject);
var
  customer : TCustomer;

begin
  myList := TList.Create;

  customer := TCustomer.Create('Neil Moffatt', 123);
  myList.Add(customer);
  FreeAndNil(customer);

  customer := TCustomer.Create('Bill Gates', 64);
  myList.Add(customer);
  FreeAndNil(customer);

  myList.Add(TCustomer.Create('Henry Cooper', 999));
  myList.Add(TCustomer.Create('Alan Sugar', 2));

  ShowListContents;

  myList.free;
end;

I mam na liście 2 Customerów o nr 999 i w sumie na liście jest ich 3.
Dla czego tak się dzieje

1

Czy ktoś może mi wyjaśnić dla czego skąd biorą się wycieki pamięci.

Ignorując fakt że to nie po polskiemu, to lista NIE zwalnia klas. Powinno być coś jak OwnsObject jak w TStringList.

I mam na liście 2 Customerów o nr 999 i w sumie na liście jest ich 3.
Dla czego tak się dzieje

A jak zwalniasz sobie coś ale pozostawiasz na liście to to dobrze? Podstawy obiektów się kłaniają.

0

nie w TStringList tylko w TObjectList lub pochodnych

0
abrakadabra napisał(a):

nie w TStringList tylko w TObjectList lub pochodnych

Mówiłem że TAK JAK W TStringList, a TStringlist posiada OwnsObjects, więc mi nie wmawiaj że nie. A to że nie TList, ale jego pochodna TObjectList posiada OwnsObjects to prawda.

0

Mam nadzieję że po polskiemu :)

Zmieniłem kod jak poniżej:

procedure TForm1.FormCreate(Sender: TObject);
var
  customer : TCustomer;
begin
  myList := TObjectList.Create;
  myList.OwnsObjects := True;

  customer := TCustomer.Create('Neil Moffatt', 123);
  myList.Add(customer);

  customer := TCustomer.Create('Bill Gates', 64);
  myList.Add(customer);

  myList.Add(TCustomer.Create('Henry Cooper', 999));
  myList.Add(TCustomer.Create('Alan Sugar', 2));

  ShowListContents;

  myList.free;
end;

I działa, nie ma wycieków pamięci

**Wielkie dzięki -123oho**

0
-123oho napisał(a):
abrakadabra napisał(a):

nie w TStringList tylko w TObjectList lub pochodnych

Mówiłem że TAK JAK W TStringList, a TStringlist posiada OwnsObjects, więc mi nie wmawiaj że nie. A to że nie TList, ale jego pochodna TObjectList posiada OwnsObjects to prawda.
Chyba ci się coś lekko pomerdało - pokaż kod, w którym TStringList ma właściwość OwnsObject i/lub zarządza własnymi obiektami. Od razu napiszę, że takiego kodu NIE MA! Nawet w helpie jest jak byk napisane
<quote=Delphi Help>Note: The TStringList object does not own the objects in the Objects array. Objects added to the Objects array still exist even if the string list is destroyed. They must be explicitly destroyed by the application.<quote>ale przecież taki znawca i hardkor jak ty nie będzie sobie d**y zawracał jakimś tam helpem. Jedyne co potrafisz to zjebać innych...

0
abrakadabra napisał(a):

Chyba ci się coś lekko pomerdało - pokaż kod, w którym TStringList ma właściwość OwnsObject i/lub zarządza własnymi obiektami. Od razu napiszę, że takiego kodu NIE MA! Nawet w helpie jest jak byk napisane

Pozwolisz ze pokaze ci swoj help bo akurat kodu nie mam (wakacje)? http://www.freepascal.org/docs-html/rtl/classes/tstringlist.ownsobjects.html

ale przecież taki znawca i hardkor jak ty nie będzie sobie d**y zawracał jakimś tam helpem. Jedyne co potrafisz to zjebać innych...

Oczywiście, czyli usiłujesz mi pokazać jaki to mądrzejszy jesteś? No niestety, ale ja swoją wiedzę popieram kodem, którym co prawda nie chwalę się na prawo i lewo ale piszę. No ale ktoś tu usiłuje mi udowodnić jaki to głupi jestem.

0
-123oho napisał(a):
abrakadabra napisał(a):

Chyba ci się coś lekko pomerdało - pokaż kod, w którym TStringList ma właściwość OwnsObject i/lub zarządza własnymi obiektami. Od razu napiszę, że takiego kodu NIE MA! Nawet w helpie jest jak byk napisane

Pozwolisz ze pokaze ci swoj help bo akurat kodu nie mam (wakacje)? http://www.freepascal.org/docs-html/rtl/classes/tstringlist.ownsobjects.html

i oczywiście najpierw upewniłeś się czego używa PYTACZ, a jak byk jest w tagach delphi a nie free pascal. Może nie zauważyłeś, ale FreePascal to nie to samo co Delphi

0
abrakadabra napisał(a):

i oczywiście najpierw upewniłeś się czego używa PYTACZ, a jak byk jest w tagach delphi a nie free pascal. Może nie zauważyłeś, ale FreePascal to nie to samo co Delphi

Jeżeli ktoś używa Delphi7 to powinien natychmiast przerzucić się na Lazarusa. Jest zdecydowanie lepszy.
Niestety, ale nie używam śmieciowego Delphi, tylko Lazarusa i nie znam wszystkich rzeczy które Lazarus ma a Delphi nie. Jeżeli masz z tego powodu problem, to nie musisz się nim dzielić. Nie interesuje on mnie. A wmawianie mi że czegoś nie ma skoro jest uważam za bezsensowne. U mnie jest, u ciebie nie ma? To pobieraj: www.lazarus.freepascal.org

0

W Delphi 2010 kod jak poniżej kompiluje się bez problemu

var lista : TStringList;
begin
lista := TStringList.Create();
lista.OwnsObjects := True;

lub taki

var lista : TStringList;
begin
lista := TStringList.Create(True); //OwnsObjects := True
0
NewDelphista napisał(a):

W Delphi 2010 kod jak poniżej kompiluje się bez problemu

Czyli magik się mylił podwójnie, oh well.

Nigdzie nie jest napisane, że chodzi o Delphi 7, a takie np.Delphi 2010 posiada parę rzeczy, których FPC nie ma (i vice versa).

Zgadywałem że nikt nie wydaje kasy na delphi. Wiem że Delphi ma coś czego FPC nie ma, ja nie traktuję tego jednostronnie. Po prostu uważam że Delphi7 jest gorsze niż FPC i lepiej z darmowych wybrać FPC. To taki side note.

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