2012-06-23 10 views
6

Czytam C++ Primer, 3rd Ed (Lippman i Lajoie) i mówi się, że gdy wektor musi zostać ponownie przydzielony, aby zrobić miejsce na więcej elementów dodanych z push_back(), elementy są kopiowane w nowej przestrzeni i następnie destruktor jest wywoływany na starych elementach. Nie rozumiem, dlaczego jest to konieczne - dlaczego dane nie mogą być kopiowane bit-for-bit? Zakładam, że odpowiedź ma związek z dynamicznym przydzielaniem pamięci, ale moja obecna linia rozumowania jest taka, że ​​nawet jeśli elementy wektorowe zajmują się pamięcią dynamiczną, dane faktycznie przechowywane w elementach będą wskaźnikami, co oznacza, że ​​kopie bitowe zachowają lokalizację, którą wskazują i nie będą stwarzać żadnych problemów. Mogę zobaczyć, jak ponowne umieszczenie dynamicznie przydzielonej pamięci, której elementy wskazują, byłoby problemem, ponieważ unieważniłoby wskaźniki, ale o ile mogę powiedzieć, że re-lokalizacja wektora nie ma powodu, aby to zrobić.C++: Automatyczna realokacja odwołuje się do konstruktorów kopii? Czemu?

Czy ktoś może podać mi prosty przykład klasy, której nie należy przenosić bit po bicie?

+2

Scenariusz, w którym konstruktor/destruktor rejestruje/wyrejestrowuje adres klasy z obiektem nadrzędnym. –

+1

Scenariusz, w którym typ nie jest typowo kopiowalny_ przychodzi na myśl. –

+1

ta.spot.is ma solidny przykład, chociaż nie nazwałbym każdego rejestru obiektów "rodzicem". Oddzielnie, niektóre klasy mogą przechowywać wskaźniki do swoich własnych elementów danych - na przykład, aby modelować jakiś stan modalny, mówiąc, że niektóre przyszłe operacje powinny teraz wpływać na ten konkretny element lub mieć iterator do wewnętrznego wektora. –

Odpowiedz

7

Oto prawdopodobnie najprostszy (ale raczej wymyślony) przykład:

class foo 
{ 
    int i; 
    int* pi; // always points to i 
}; 

Tutaj konstruktor kopia będzie utrzymać niezmienne że pi wskazuje i. Sam kompilator nie byłby w stanie samodzielnie obliczyć tego związku, stąd potrzeba wywołania konstruktora kopiowania.

4

Czy ktoś może podać mi prosty przykład klasy, której nie należy przenosić bit po bicie?

przez standard, robi memcpy na dowolny klasy, która jest nie a POD in C++03 (or trivially copyable in C++11) byłoby zakwalifikować. memcpy ing non-POD (lub niemożliwa do skopiowania) wywołuje niezdefiniowane zachowanie; dlatego należy użyć faktycznej kopii (lub w C++ 11, przenieść) konstruktora musi.

Więc std::vectorsama dotyczy, ponieważ nie jest to typ POD (aw C++ 11, to nie jest trywialnie copyable).

Powiązane problemy