Problem z new i delete w kontenerze vector
Ostatnio zmodyfikowano 2012-05-11 23:41
ison |
» 2012-05-11 23:09:02 asserty Twoim przyjacielem, uwierz mi, to jest coś co pomaga w najmniej oczekiwanym momencie ;) #include <cassert>
void CAkwarium::delete_item( int i ) { assert( i >= 0 && i < obj_list.size() ); delete obj_list[ i ]; obj_list.erase( obj_list.begin() + i ); }
http://www.cplusplus.com/reference/clibrary/cassert/assert/albo po prostu dodaj -D _GLIBCXX_DEBUG przy kompilacji (ofc jeśli dostępne ;p) pokaż miejsce gdzie wywołujesz delete_item |
|
Virpi Temat założony przez niniejszego użytkownika |
» 2012-05-11 23:27:49 Wstawiłem assert, ale nic nie dało, wywołuję to tak:
while( !( action.Key.Code == sf::Key::Escape && action.Type == sf::Event::KeyReleased ) ) { oknoAplikacji.GetEvent( action ); const sf::Input & wejscie = oknoAplikacji.GetInput(); moje_akwarium.add_item( action ); for( unsigned int i = 0; i < moje_akwarium.obj_list.size(); i++ ) { moje_akwarium.wsk = moje_akwarium.obj_list[ i ]; if( wejscie.IsMouseButtonDown( sf::Mouse::Left ) ) { CElement_ruchomy * wskaz = dynamic_cast < CElement_ruchomy *>( moje_akwarium.wsk ); if( wskaz != NULL ) wskaz->change_active( wejscie ); } CSlimak * wskaz = dynamic_cast < CSlimak *>( moje_akwarium.wsk ); if( wskaz != NULL ) { wskaz->move( action ); wskaz->eat_seaweed( moje_akwarium ); } else { CKamien * wskaz = dynamic_cast < CKamien *>( moje_akwarium.wsk ); if( wskaz != NULL ) { wskaz->stop_obj( moje_akwarium ); wskaz->destroy_seaweed( moje_akwarium ); } } } }
w tym miejscu wywoływana jest funkcja, która wygląda tak:
void CKamien::destroy_seaweed( CAkwarium m_akw ) { for( unsigned int a = 0; a < m_akw.obj_list.size(); a++ ) { CElement_gry * wsk = m_akw.obj_list[ a ]; CWodorost * wskaz = dynamic_cast < CWodorost *>( wsk ); if( wskaz != NULL ) { Tstruct visible_poz = wskaz->read_poz(); Tstruct visible_hitbox = wskaz->read_hitbox(); if((( poz.x + hitbox.x ) >= visible_poz.x ) &&(( poz.x ) <=( visible_poz.x + visible_hitbox.x ) ) ) { m_akw.delete_item( a ); } } } }
jeśli kamien znajdzie wodorost, który znajduje się na nim, to wywołuje funkcje, która go niszczy:
void CAkwarium::delete_item( int i ) { std::cout << "ilosc przed " << obj_list.size() << std::endl; assert( i >= 0 && i < obj_list.size() ); delete obj_list[ i ]; obj_list.erase( obj_list.begin() + i ); std::cout << "ilosc po " << obj_list.size() << std::endl; }
to caly łańcuszek.... może nie rozumiem dobrze metody obj_list.erase() |
|
ison |
» 2012-05-11 23:34:46 void CKamien::destroy_seaweed( CAkwarium m_akw )
kopia? ;) tu raczej powinna być referencja |
|
Virpi Temat założony przez niniejszego użytkownika |
» 2012-05-11 23:41:12 Nie ma to jak oko fachowca :D Dziękuję bardzo za pomoc :) jednak nad każdym znaczkiem trzeba pomyśleć.... i cały dzień przez niedopatrzenie zmarnowany... ale najważniejsze, że już jest ok :) |
|
1 « 2 » |