Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z new i delete w kontenerze vector

Ostatnio zmodyfikowano 2012-05-11 23:41
Autor Wiadomość
ison
» 2012-05-11 23:09:02
asserty Twoim przyjacielem, uwierz mi, to jest coś co pomaga w najmniej oczekiwanym momencie ;)

C/C++
#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
P-56511
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:

C/C++
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 ); //    <==== tutaj jest wywołana
            }
           
        }
    }
}

w tym miejscu wywoływana jest funkcja, która wygląda tak:

C/C++
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 ); // <==== tutaj jest wywołana
            }
        }
       
    }
   
}

jeśli kamien znajdzie wodorost, który znajduje się na nim, to wywołuje funkcje, która go niszczy:

C/C++
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()
P-56512
ison
» 2012-05-11 23:34:46
C/C++
void CKamien::destroy_seaweed( CAkwarium m_akw )
kopia? ;)
tu raczej powinna być referencja
P-56513
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 :)
P-56514
1 « 2 »
Poprzednia strona Strona 2 z 2