Usuwanie elementów tworzonych dynamicznie z QList

0

Witam. Mam taką sobie listę, której elementy to wskaźniki do struktury:

QList<myStruct*> mstr;

Potem dodawanie nowego elementu odbywa się tak:

mstr.append(new myStruct);
mstr.last()->data = jakas_data; 

Dodam, że to mam wszystko we własnej klasie, dziedziczącej po QObject.
Jak widać, zostały tworzone nowe zmienne dynamicznie, dlatego wypadałoby zwolnić pamięć (?).
Jak to zrobić z tej listy ?
Wpadłem na coś takiego, jednak nie jestem w stanie sprawdzić (na tym etapie tworzenia apki) czy to działa (kompiluje się bez błędów):

 for(int i = 0; i < mstr.length(); i++)
    {
        delete mstr[i];
    }

Jednak zastanawiam się, czy można takie elementy usunąć wbudowaną funkcją remove lub jedną z nich (remove all). Dokładniej rzecz biorąc, czy zostanie zwolniona poprawnie pamięć ?

0

Nie, nie zostanie. Używaj smart pointerów, np. std::unique_ptr.

Ewentualnie możesz użyć np. boost::ptr_vector ( http://www.boost.org/doc/libs/1_55_0/libs/ptr_container/doc/ptr_vector.html ) ale ogółem odzwyczajaj się od używania nagiego new/delete, bo to zła praktyka jest.

1

musisz użyć jakiegoś mądrego wskaźnika. Np:

QList<QSharedPointer<myStruct> > mstr;

albo QScopedPointer.

0

Jeżeli usuniesz wszystkie wskaźniki z listy przy pomocy metod w stylu remove, to sorry, ale będziesz miał wyciek, bo po tej operacji nie będziesz mógł się odwołać do tych regionów pamięci, na które owe wskaźniki wskazywały, aby je zwolnić.

Rozwiązanie jest takie:

  • użyć tej pętli, którą stworzyłeś, w destruktorze klasy
  • użyć inteligentnych wskaźników (poczytaj o klasie QScopedPointer) i wtedy bez obaw bawić się z remove - zalecam drugą opcję

A żeby sprawdzić, czy wyciek pamięci ma miejsce, to wystarczy użyć profilera (valgrind, itp.), lub też nawet standardowe narzędzie perfmon w przypadku Windy (http://stackoverflow.com/questions/69332/tracking-cpu-and-memory-usage-per-process - tutaj masz napisane, jak go używać).

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