[BCB] Czy trzeba usuwać komponenty tworzone dynamicznie?

0

Witam.
Mam takie pytanie: czy jesli po uruchomieniu formy tworzy ona dynamicznie wiele komponentów, np. Labele tak jak poniżej:

...     
      TLabel *lab = new TLabel(this);    
      lab->Left=4;
      lab->Top=30;
      lab->Caption="Tekst";
      lab->Name="Label1";
      lab->AutoSize=true;
      Form1->InsertControl(lab);
...

i raz stworzone Labele mają być aż do zamknięcia formy, to czy muszę z zdarzeniu OnClose formy usuwać je poleceniem

delete()

w celu zwolnienia pamięci czy program sam po sobie "posprząta"?

0

myślę, że powinieneś zwalniać pamięć

0

Z Twojej wypowiedzi wnioskuję, że nie jesteś do końca przekonany, ale dzięki - jeden głos za, czekam na następne :)
A swoją drogą : jak usuwać?
Jedyny sposób jaki mi działa to coś takiego wpięte w onClose formy:

...
int dynamicznych;   //liczba utworzonych dynamicznie labeli
...
for (int t=1; t<=dynamicznych; t++)     
          {
             TComponent* a = FindComponent("Label"+IntToStr(t));
             TLabel* b = dynamic_cast<TLabel*> (a);
             delete(b);
          }

ale wygląda to tak, że klikam guzik zamknij i jak mam np. 50 labeli utworzonych w ten sposób (co w programie który piszę wcale nie jest taką dużą liczbą), to wygląda to tak, że program się 'wiesza' i widać jak jeden po drugim znikają labele. Trwa to dobre 2 sekundy (dla 50 labeli) i dopiero wtedy się zamyka. Nie powiem żeby było to estetyczne... Może są jakieś szybsze sposoby? Próbowałem odwoływać się do nazwy (w stylu

delete("Label1")

, ale nie działa.
A może jednak nie trzeba ich usuwać? ;)

0
  1. Moze bedzie szybciej, jesli uzyjesz inteligentnych wsaznikow:
#include <memory>
std::auto_ptr<TLabel> Label (new TLabel(this));

Zmienna Label zachowyje sie jak zmienna automatyczna - jest usuwana z pamieci z chwila wyjscia poza zakres jej widocznosci.

  1. Jesli nie usuniesz jawnie obiektu, predzej czy pozniej zrobi to za Ciebie system operacyjny.
0
  1. Wypada zwalniać pamięc po sobie zawsze... Teoretycznie program (system) powinien zwalniać pamięć - ale tak naprawdę nie mam pewności. W każdym razie - z definicji;) - pamięc zaalokowaną należy zwalniać zawsze:)

  2. Twórz komponenty w tablicy wskaźników na nie... A potem usuwaj je w oparciu o tą tablicę... Nawet na procku 100MHz powinno iść jak burza (no, jak na VCL :P ) - nie widać tego efektu znikania...

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