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

Dynamiczne tworzenie zmiennej a wektor.

Object Storage Arubacloud
0 głosów
1,553 wizyt
pytanie zadane 4 grudnia 2015 w C i C++ przez Rafajah Bywalec (2,090 p.)

Witajcie.

Od jakiegoś czasu uczę się programować w c++. Mam pewien nurtujący mnie problem, którego za nic nie mogę rozwiązać i potrzebuję wytłumaczenia. Jak to jest, że to działa: 

  vector <int> vec;

    int *x = new int;
    *x=0;
    vec.push_back(*x);
    delete x;

Natomiast to już nie:

vector <Postac> postacie;
    Postac *postac = new Postac;
    postacie.push_back(*postac);
    delete postac;

 Niby się kompiluje ale program przestaje działać w momencie użycia delete postac;

Wrzuczam jeszcze caly kod gdyby to w klasach leżał problem:

http://wklej.org/hash/c19501402c7/

 

Z góry dzięki za wyrozumiałość i ewentualne odpowiedzi ;)

 

@Edit:

Skoro już zdecydowałem się na absorbowanie Waszego czasu to od razu zapytam.

Jaki jest najlepszy sposób aby bez wycieku pamięci tworzyć dynamicznie obiekty, dodawać je do wektora, a następnie usuwać wraz ze zwolnieniem pamięci?

 

 

3 odpowiedzi

+2 głosów
odpowiedź 4 grudnia 2015 przez adrian17 Ekspert (344,860 p.)

Skoro już zdecydowałem się na absorbowanie Waszego czasu to od razu zapytam.

Jaki jest najlepszy sposób aby bez wycieku pamięci tworzyć dynamicznie obiekty, dodawać je do wektora, a następnie usuwać wraz ze zwolnieniem pamięci?

1. Nie alokować ich dynamicznie.

2. Po co potrzebujesz je alokować dynamicznie? Polimorfizm? Jak nie, to opisz o co chodzi.

3. Jeśli bardzo potrzebujesz je alokować dynamicznie, owiń je w std::shared_ptr.

komentarz 4 grudnia 2015 przez Rafajah Bywalec (2,090 p.)
Po prostu brzydko mówiąc "ujebało" mi się, że trzeba je alokować dynamicznie żeby mieć kontrolę nad pamięcią. Nie wiedziałem, że wektor robi to za mnie.

Dzięki za odpowiedź, poczytam również o shared_ptr gdybym faktycznie musiał kiedyś jednocześnie użyć polimorfizmu i wektorów.
komentarz 4 grudnia 2015 przez adrian17 Ekspert (344,860 p.)
(Są powody na dynamiczną alokację pamięci inne niż polimorfizm, ale zdarzają się raczej rzadko.)
+1 głos
odpowiedź 4 grudnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Korzystając z std::vector używa się metod zawartych w tej klasie - użycie operatora delete może powodować niezdefiniowane skutki. Przeczytaj sobie: http://cpp0x.pl/kursy/Kurs-STL-C++/Kontener-tablicy-std-vector/119http://www.cplusplus.com/reference/vector/vector/.

 

komentarz 4 grudnia 2015 przez Rafajah Bywalec (2,090 p.)
Na cpp0x.pl szukałem info o wektorach zanim napisałem ale nie znalazłem tego linka, dzięki za niego ;)
+1 głos
odpowiedź 5 grudnia 2015 przez criss Mędrzec (172,590 p.)

Nie musisz alokować dynamicznie, żebyś dodane do vectora elementy mógł usuwać z pamięci :P Tym zajmuje się vector (zainteresuj się czym wlaściwie jest i jak działa). Z resztą metoda push_back kopiuje obiekt. Także jeśli stworzysz obiekt, a potem go dodasz do vectora - będziesz miał 2 różne obiekty. Chyba, że stworzysz vector wskaźników, ale powtarzam - to bez sensu dopóki w gre nie wchodzi polimorfia.

Co do drugiego pytania - jeśli już musisz. Najlepszym sposobem jest std::shared_ptr. http://kacperkolodziej.pl/artykuly/programowanie/263-cpp11-wskazniki-unikalne-i-wspoldzielone-unique-ptr-shared-ptr.html

edit: właściwie przepisałem kod Adriana, nie przeczytalem jego odpowiedzi zanim zacząłem pisać swoją.

Podobne pytania

0 głosów
3 odpowiedzi 1,369 wizyt
pytanie zadane 18 listopada 2015 w C i C++ przez Baakoma Użytkownik (780 p.)
0 głosów
1 odpowiedź 250 wizyt
0 głosów
1 odpowiedź 288 wizyt
pytanie zadane 21 maja 2021 w C i C++ przez Billy Użytkownik (680 p.)

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 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!

...