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?
Scenariusz, w którym konstruktor/destruktor rejestruje/wyrejestrowuje adres klasy z obiektem nadrzędnym. –
Scenariusz, w którym typ nie jest typowo kopiowalny_ przychodzi na myśl. –
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. –