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ść
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:

C/C++
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; // dodaj slimaka
            obj_list.push_back( slimak );
        }
        else
        {
            if( key.Key.Code == sf::Key::K )
            {
                CElement_gry * kamyk = new CKamien; // dodaj slimaka
                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?
P-56481
SeaMonster131
» 2012-05-11 15:22:37
delete obj_list[ i ];
?
P-56484
jsc
» 2012-05-11 15:24:27
Najpierw kasujesz całą listę, później jej (już jej nie ma) poszczególny element.
P-56485
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.
P-56486
jsc
» 2012-05-11 15:35:01
To skasuj ślimaka.
P-56488
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?
P-56491
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
P-56501
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:

C/C++
void CAkwarium::delete_item( int i )
{
    std::cout << "ilosc przed " << obj_list.size();
    std::vector < CElement_gry *>::iterator itr;
    itr = obj_list.begin();
    //delete obj_list[i];
    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ć.
P-56509
« 1 » 2
  Strona 1 z 2 Następna strona