[Delphi] FreeAndNil a Free?

0

Takie troche dręczące mnie lamerskie pytanie :P . Czy musze zawsze usuwać wskaźnik do zmiennej przez Zmienna := nil; czy samo Free wystarczy?.
Mam tu na myśli przykład wątku:

Watek := TWatek.Create(False);

Jest ustawiony na FreeOnTerminate, czyli jak zrobi swoje to sie wyładowuje z pamieci. Ale czy musze dodatkowo zwolnić wskaźnik Watek := nil;? Bo staram sie zawsze unikać wycieków pamięci, taki wątek moge tworzyć kilkaset razy buttonem w aplikacji, czy musze przed utworzeniem kolejnego wątku usunąć wskaźnik poprzedniej kopii? Np:

Watek := nil;
Watek := TWatek.Create(False);

Bo odnosze wrażenie że robią mi sie duble wskaźników wątków w pamięci :P

0

Przy FreeOnTerminate (czy powiedmy Free na jakimś obiekcie) wątek (obiekt) się usuwa zwalniają pamięć, ale we wskaźniach może pozostać jego stary adres: nigdy nie musisz przypisywać nil do wskaźnika usuniętego obiektu. Obiekt jest już usunięty, a wskaźnik do niego jest tylko liczbą. (Dodatkowo nil odpowiada po prostu wartości 0).

0

nie jest to koniueczne ani obowiązkowe, ale lepiej sobie wyczyścić wskaźnik, a żeby nie robić tego w x krokach najlepiej niepotrzebne obiekty usuwać przez FreeAndNil(obiekt) - jak masz możliwość to sobie zobacz jak wygląda procedura FreeAndNil. Powyższe = true jeśli chodzi o wszystko poza wątkami :P. W wątkach wystarczy, że dasz jako pierwsze w execute FreeOnTerminate = True. Dlaczego nie robi się MojWatek := nil? Ano z tej prostej przyczyny, że wątek żyje swoim życiem i nie jesteś w stanie przewidzieć, kiedy się skończy, czyli kiedy obiekt jest usuwany z pamięci.

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