Witam,
Mam problem z dealokacją wskaźnika na wektor wskaźników, który jest polem pewnej klasy.
Według StackOverflow wystarczy w pętli dla każdego elementu takiego wektora użyć delete, a na końcu użyć metody clear(). Na cppreference (link: https://en.cppreference.com/w/cpp/container/vector/clear) jest napisane, że wszelkie wskaźniki zostaną uniważnione i nie wiem czy to oznacza, że pamięć zostaje zwolniona, czy tylko stracę adresy na zaalokowane miejsca na stercie?
Wreszcie valgrind i debugger z visuala2017 wykrywają wycieki mimo zastosowania wszystkich sensownych (według mnie) kombinacji usuwania tego wektora.
Tym krótkim przykładem pokażę na czym polega problem.
class Element {
public:
Element(int num) { val = new int[num]; }
~Element() { delete[] val; }
private:
int *val;
};
class Base {
public:
Base(int size) {
list = new std::vector<Element*>(size, new Element(1000));
}
~Base() {
/* odkomentowanie spowoduje podwojne zwolnienie pamieci
* mimo ze teoretycznie teraz sa wycieki
for(int i = 0; i < list->size(); ++i) {
delete list->at(i);
}
*/
list->clear();
delete list;
}
private:
std::vector<Element*> *list;
};
Teraz dla przykładowej instancji klasy Base w mainie
int main() {
Base *test = new Base(1000);
delete test;
return 0;
}
valgrind zwraca taki komunikat:
==4809== HEAP SUMMARY:
==4809== in use at exit: 4,008 bytes in 2 blocks
==4809== total heap usage: 6 allocs, 4 frees, 84,744 bytes allocated
==4809==
==4809== LEAK SUMMARY:
==4809== definitely lost: 8 bytes in 1 blocks
==4809== indirectly lost: 4,000 bytes in 1 blocks
==4809== possibly lost: 0 bytes in 0 blocks
==4809== still reachable: 0 bytes in 0 blocks
==4809== suppressed: 0 bytes in 0 blocks
Jak więc powinien wyglądać destruktor klasy Base, by nie było wycieków? Dodatkowo nie chcę korzystać z inteligentnych wskaźników.
Z góry dziękuję za każdą pomoc i sugestię.