[C++] vector::clear - kwestia wywołania destruktora


(Spwmarluk) #1

Witam,

Mam następujący kod:

#include 

#include 

using namespace std;


struct dane

{

	int a;

	vector w;

};


int main()

{

vector lista;

dane d;

d.a = 1;

d.w.assign(10, 10);

lista.push_back(d);

d.a = 2;

d.w.assign(5, 20);

lista.push_back(d);

d.w.clear();

for(vector::iterator it=lista.begin(); it < lista.end(); it++)

{

	cout << "a: " << it->a << ", w: ";

	for(vector::iterator it2=it->w.begin(); it2 < it->w.end(); it2++)

		cout << *it2 << " ";

	cout << endl;

}

lista.clear();

return 0;

}

Pytanie brzmi:

Czy po wywołaniu lista.clear() zostanie także wywołany destruktor dla każdego wektora w strukturze 'dane' ? Jeżeli nie, to czy należy się tym przejmować i ręcznie czyścić każdy wektor struktury przed wyczyszczeniem listy?


(Sawyer47) #2

Tak, zostanie wywołany. Możesz sprawdzić samodzielnie zastępując wektor własną klasą która wypisze coś w destruktorze.


(Spwmarluk) #3

Właśnie w związku z tym, że ciągle używam struktur nie byłem pewien jak to się zachowa. A można napisać własny destruktor do struktury?


([alex]) #4

EDIT: Mój błąd, informacja zawarta w pierwotnej wersji jest niepoprawna.


(Sawyer47) #5

[alex] mógłbyś to jakoś uzasadnić? Bo mi się wydaje, że nie wprowadzam w błąd. Przecież w wektorze "lista" znajdują się dwa obiekty struktury dane (dwukrotne wywołanie push_back), kiedy wywołuje lista.clear() te dwie struktury są usuwane, ale przedtem uruchamiane są destruktory obiektów składowych, czyli tego wektora wewnątrz "dane". Proszę więc o wytłumaczenie tego, jeśli się mylę.


(Fiołek) #6

Zostanie wywołany destruktor dla każdego obiektu. nr47 ma rację, a ty kolegę w błąd wprowadzasz :wink: http://www.cplusplus.com/reference/stl/vector/clear.html


([alex]) #7

Wczoraj byłem nieco nieprzytomny, jakoś mi się vector ze składową dynamiczną się pomylił. nr47 i Fiołek mają racje, dopóki struktura nie zawiera żadnych wskaźników lub referencji pod które dynamicznie przydziela się pamięć nie trzeba pisać destruktorów.

PS. Poprzednią swoją wiadomość lepiej skasuję aby przypadkiem komuś w głowie nie namieszała.


(Spwmarluk) #8

Dzięki za pomoc, wolę, żeby nie zostawał śmietnik po usuwaniu obiektów.

A jak jest w końcu ze strukturą, da się napisać do niej własny destruktor? To tak z czystej ciekawości, bo jak na razie, rozumiem, że jest ok.

A opis pod tym linkiem http://www.cplusplus.com/reference/stl/vector/clear.html czytałem, tylko nie jestem jeszcze zbyt 'biegły' i myślałem, że trzeba napisać najpierw destruktor, żeby był wywołany.


([alex]) #9

Struktura ma tylko jedną różnice w porównaniu z klasą (mam na myśli różnice pomiędzy zapisami struct { }; a class { }; ) - domyślnie wszystkie składowe struktury są publiczne, a dla klasy domyślnie prywatne, reszta - dokładnie to samo.