c++/cli Wycieki pamięci a delete

0

Nie bardzo mogę znaleźć w googlach co trzeba "ubijać" po skończonej pracy.
Z tego co wyczytałem to obiekty z gwiazdką (wskaźniki)? Czy coś jeszcze?
Byłbym wdzięczny jakby ktoś mógł wytłumaczyć/podrzucić dobry tutorial o zwalnianiu alokowanej pamięci w c++/cli.

1

Pozamykać pliki, połączenia sieciowe, połączenia z bazami danych...

Wskaźniki to zależy – jeśli przydzielałeś pamięć przez new, to trzeba zwolnić przez delete, ale jeśli pobrałeś tylko wskaźnik do jakiejś istniejącej zmiennej, to już niekoniecznie.

0

A jak np mam złożone obiekty z własnych structów ale bez wskaźnika to też da się jakoś ubić?
Mam pewną funkcje i niby tylko jeden wskaźnik a reszta to mniej lub bardziej złożone zmienne statyczne a pochłania ~100kb ramu przy każdym wykonaniu

1

Pochłania bo w c++/CLI obiekty zarządzane zwalnia gc collector, który może sobie pamięć zostawić bo tak mu pasuje i zwolnić kiedy mu się zachce. Tylko to co tworzysz przez niezarządzane new możesz zwolnić ręcznie chociaż też nie wiadomo czy się zwolni zaraz czy za pół godziny, czy może wcale.

1

Trudno cokolwiek powiedzieć, jeśli nie pokażesz kodu.

Jeśli używasz tylko obiektów zarządzanych (ref class/struct , value class/struct) to w zasadzie nie ma prawa być wycieku.

0

czyli powiadacie że się tym nie przejmować?
wczoraj sobie testowałem działanie programu i przez 3 godziny z 66 mb urósł do 320mb i zwracać nic nie zamierzał. To troszkę niepokojące

1

jeszcze jak kasujesz jakiś obiekt deletem to później tak dla pewności możesz sobie ustawić ten wskaźnik na nulla żeby uniknąć ponownego skasowania bo przez to program może się też wysypać.

0
Dubler napisał(a):

czyli powiadacie że się tym nie przejmować?
wczoraj sobie testowałem działanie programu i przez 3 godziny z 66 mb urósł do 320mb i zwracać nic nie zamierzał. To troszkę niepokojące

‌ ‌user image

0

Przeleciałem jeszcze raz cały kod programu i generalnie zmniejszyłem zużycie (wg. task managera) z 200+kb/5s do ~24kb/5s Bo nie kasowałem jednego obiektu. Z tego co widze w ANTS memory profilerze w ciągu minuty wykonywania przybyło zaalokowanej i niewykorzystanej pamięci ~29kb i to głównie z funkcji formy więc to chyba akceptowalne jest.
Dziękuje wszystkim za pomoc.

1

Jeśli używasz tylko obiektów zarządzanych (ref class/struct , value class/struct) to w zasadzie nie ma prawa być wycieku.

To zbytnie uproszczenie. Wystarczy, że zapomnimy o jakiejś referencji i cały obiekt będzie nam wisiał do końca. Np. nieodłączenie eventu spowoduje, że obiekt nie zostanie zwolniony. Albo niewywołanie Dispose na obiekcie, który implementuje IDisposable, alokuje jakieś niezarządzane zasoby oraz nie ma wywołania Dispose w jego destruktorze.

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