Virpi Temat założony przez niniejszego użytkownika |
Problem z new i delete w kontenerze vector » 2012-05-11 15:17:32 Witam, tak przedstawiają się główne części mojego programu:
class CAkwarium { public: CAkwarium(); virtual ~CAkwarium(); void add_item( sf::Event key ); void delete_item( int i ); std::vector < CElement_gry *> obj_list; };
void CAkwarium::add_item( sf::Event key ) { if( key.Type == sf::Event::KeyPressed ) { if( key.Key.Code == sf::Key::S ) { CElement_gry * slimak = new CSlimak; obj_list.push_back( slimak ); } else { if( key.Key.Code == sf::Key::K ) { CElement_gry * kamyk = new CKamien; obj_list.push_back( kamyk ); } else { if( key.Key.Code == sf::Key::W ) { CElement_gry * wodorost = new CWodorost; obj_list.push_back( wodorost ); } } } } }
void CAkwarium::delete_item( int i ) { delete obj_list[ i ]; obj_list.erase( obj_list.begin() + i ); }
I o ile dodawanie do wektora działa dobrze (w pozostalej cześć programy elementy zachowują się dobrze), ale przy usuwaniu elementów program wysypuje się. Możecie mi podpowiedzieć, co robię źle? |
|
SeaMonster131 |
» 2012-05-11 15:22:37 |
|
jsc |
» 2012-05-11 15:24:27 Najpierw kasujesz całą listę, później jej (już jej nie ma) poszczególny element. |
|
Virpi Temat założony przez niniejszego użytkownika |
» 2012-05-11 15:26:20 W takim razie pewnei źle zrozumiałem idee, ale obj_list to wektor wskaźników i chciałbym usunąć to, na co wskazuje wskaźnik znajdujący się pod np. obj_list[ 2 ] a później sam wskaźnik z kontenera.
|
|
jsc |
» 2012-05-11 15:35:01 To skasuj ślimaka. |
|
Virpi Temat założony przez niniejszego użytkownika |
» 2012-05-11 15:43:39 w kontenerze mam wskaźniki do różnych klas dziedziczących po CElement_gry (widać po metodzie add_item( sf::Event key ) i np chce usunąć element, na który wskazuje wskaźnik znajdujący się pod obj_list[ i ] , bo jest to np element klasy CWodorost, na ktorym znajduje się element klasy CKamien. Reszta ma normalnie zostać.
Możecie mo podpowiedzieć, jak to dobrze zapisać? Bo teraz program kompiluje mi się, ale zawiesza się podczas usuwania dowolnego elementu.
Właśnie jak mam skasowac tego slimaka albo wodorost? |
|
ison |
» 2012-05-11 19:29:46 @Virpi, coś im się pomyliło chyba ;) funkcja kasująca jest dobra, może wychodzisz poza zakres vectora? wrzuć tam jakiegoś asserta |
|
Virpi Temat założony przez niniejszego użytkownika |
» 2012-05-11 21:30:40 Próbowałem ustawić sobie coś takiego, że jak wykona się ta funkcja delete_item to wtedy ustawiam i = 0, czyli zaczynam przeglądać cały wektor od początku, ale znowu się sypie. w ogóle jak usunę coś z tego wektora, to program sypie się w tej samej iteracji, bo później mam bardzo podobną pętlę for, wyświetlającą wszystko na ekranie i do niej w ogóle nie dochodzi. Może powinienem umieścić coś w destruktorach klas, których elementy chcę usuwać? Tylko nie mam pojęcia, co mogłoby w nich być.
W sumie jeśli funkcja kasuje tylko wskaźnik z wektora nie kasując obiektu na który ten wskaźnik wskazuje (mniejsza o wyciek pamięci), to też nei działa:
void CAkwarium::delete_item( int i ) { std::cout << "ilosc przed " << obj_list.size(); std::vector < CElement_gry *>::iterator itr; itr = obj_list.begin(); obj_list.erase( itr + i ); std::cout << "ilosc po " << obj_list.size() << std::endl; }
ilość przed i po wyświetlają się dobrze. także właśnei być może gdzieś wychodze poza zakres, ale nie mam pojęcia, jak to poprawić. |
|
« 1 » 2 |