• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Wrzucanie do wektora

Object Storage Arubacloud
0 głosów
179 wizyt
pytanie zadane 9 maja 2015 w C i C++ przez criss Mędrzec (172,590 p.)
zamknięte 17 listopada 2016 przez criss

Do wektora wrzucam dynamiczne obiekty w ten sposób:

w=new Obiekt();
tab.push_back(*w);

Stwierdziłem, że zobacze, co się stanie jeśli usune obiekt z pamięci, ale nie wyrzuce elementu wektora (erase()). Okazuje się że... obiekt jest ciągle poprawnie odczytywany. O co tu chodzi? Powinienem wrzucać do wektora przez referencje (&)? Tylko jak to zrobić? push_back(&*w)? Kompilator na to nie pozwala.

Edit: Chociaż w sumie to też nie miałoby sensu. Bo usuwam w ten sposób:

w=&tab[x];
delete w;

Więc nawet gdyby wektor dostawał tylko kopie tego obiektu, to w końcu usuwam właśnie to co jest w wektorze.

komentarz zamknięcia: .

1 odpowiedź

0 głosów
odpowiedź 9 maja 2015 przez MrWeb Stary wyjadacz (10,200 p.)
wybrane 10 maja 2015 przez criss
 
Najlepsza

Klasa std::vector robi sobie kopie przekazywanych obiektów, na wypadek gdyby programista wpadł na pomysł dealokacji przekazywanych obiektów (tak jak ty smiley)

komentarz 9 maja 2015 przez criss Mędrzec (172,590 p.)
1. Czyli nie moge vectorowi podać oryginału?

2. Czyli w zasadzie od razu po push_back(), moge "pierwotny" obiekt usunąć, bo bez sensu zapycham 2 razy więcej pamięci?
komentarz 9 maja 2015 przez MrWeb Stary wyjadacz (10,200 p.)
Dobra, znalazłem dowód :)

void push_back( const T& value ); (1)
void push_back( T&& value ); (2)

1) The new element is initialized as a copy of value.

2) value is moved into the new element.

źródło (http://en.cppreference.com/w/cpp/container/vector/push_back)

Czyli metoda push_back(const T& value) wykonuje kopię obiektu przy jego wsadzeniu do vectora czyli po przekazaniu obiektu można go usunąć ;)

w = new Obiekt();
tab.push_back(*w);
delete w; w = nullptr;

 

komentarz 9 maja 2015 przez MrWeb Stary wyjadacz (10,200 p.)
Przy okazji, sorrki za ukrycie postu, musiałem się upewnić, że mam rację więc na chwilę ukryłem żeby ktoś się nie przyczepił :)
komentarz 9 maja 2015 przez criss Mędrzec (172,590 p.)
A ja myslałem, ze usunąłem twoją odpowiedź : D Ok, dzięki. Więc przy usuwaniu elementu z wektora poprzez erase(), ta kopia utworzoan dla wektora też znika z pamięci, tak? To  by tłumaczyło crashowanie się mojego programu :D
komentarz 9 maja 2015 przez MrWeb Stary wyjadacz (10,200 p.)

Dokładnie tak :)
iterator erase( iterator pos );

Removes specified elements from the container.
http://en.cppreference.com/w/cpp/container/vector/erase

komentarz 9 maja 2015 przez criss Mędrzec (172,590 p.)

Ok, dzięki :) Btw, co znaczy " auto &i : c " (przykład w twoim linku)?

komentarz 9 maja 2015 przez daan Pasjonat (17,640 p.)

Pytanie czy masz vector wskaźników czy obiektów to jest zasadnicza różnica :) a co do auto - słówko wymusza na kompilatorze aby samodzielnie określił typ danego wyrażenia np. 

auto it = vector.begin();

Utworzy iterator na ten wektor, a ty nie musisz pamiętać jaki to vector był i zamiast np. 

vector<typ>::iterator it

dajesz auto it :) Jeżeli chodzi o & to dzięki temu nie jest tworzona niepotrzebna kopia, a my odwołujemy się do orginalnej wartości :P np.

for(auto& i : tablicaInt) i = 0;

spowoduje wyzerowanie każdego elementu tej tablicy, gdyby nie było & tablica byłaby  nienaruszona :P 

komentarz 10 maja 2015 przez criss Mędrzec (172,590 p.)

Super, dzięki :) Co do

Pytanie czy masz vector wskaźników czy obiektów to jest zasadnicza różnica

 Tak, wiem. Mam wektor obiektów, więc wszystko ładnie działa jak trzeba.

Podobne pytania

0 głosów
1 odpowiedź 969 wizyt
pytanie zadane 27 października 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)
0 głosów
1 odpowiedź 754 wizyt
pytanie zadane 24 kwietnia 2022 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 13 stycznia 2021 w C i C++ przez Pelo Użytkownik (520 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...