problem z iteratorem vectora przy erase

Odpowiedz Nowy wątek
2011-08-26 20:41
0

Witam,
mam prosty problem z metodą erase w std::vector. Zwracany iterator się nie zmienia po usunięciu obiektu z listy.

przykładowy kod:

 
#include <vector>
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    std::vector<char *> Lines;
    std::vector<char *>::iterator lit;
 
    char * test = "trzydwajeden";
    Lines.push_back(test);
 
    lit = Lines.begin();
 
    while(lit != Lines.end())
    {
        char *str=NULL;
        str = *lit;
        lit = Lines.erase(lit); //dalej wskazuje na 'trzydwajeden' zamiast na end
        //lit = Lines.begin(); //też nie działa
        if(str!=NULL)
            delete(str);
 
    }
 
}

patrze jeszcze raz na dokumentacje a tam pisze:

Return value
A random access iterator pointing to the new location of the element that followed the last element erased by the function call, which is the vector end if the operation erased the last element in the sequence.

tylko nie u mnie...
w tym projekcie aplikacja sie wiesza, a w drugim mi wywala asserta

_BLOCK_TYPE_IS_VALID(phead->nBlockUse) - assertion faliure

troche jestem zdezorientowany...

edytowany 1x, ostatnio: madmike, 2011-08-26 20:42

Pozostało 580 znaków

2011-08-26 22:22
0

Ale ty próbujesz usunąć przez delete tablicę statyczną po pobraniu adresu z vektora , przecież to jest błąd .
Właściwie pierwszy element lokalnego statycznego napisu przez delete str ; .
Też chyba coś mi kiedyś nie działało.Rozwiązałem to trochę inaczej , poprzez 2 iteratory i poszło , no tyle że obiekty mam przydzielane new na stercie .

                     // część funkcji usuwającej z wektora element o wybranym indeksie
                    //  kod iteracyjny na piechotę , z powodu dziwnego zachowania się erase(iter,iter) , wywalało mi program  
                    //  z błędem skierowanym na bibliotekę STL więc tak wyszło
                    //  ponieważ ta która jest dołączona do kompilatora jest lekko kulawa więc ch,   
   QServer*Srv;
        vector<QServer*>::iterator qBeg = qSymbolServer.begin() ;
        vector<QServer*>::iterator qEnd = qSymbolServer.end() ;
 
        for (int i = 0 ;qBeg!=qEnd ;qBeg++,i++)
        {
         if(i==index)
         {
           Srv = qSymbolServer[i];
           qSymbolServer.erase(qBeg); // usunięcie wskaźnika na obiekt z wektora 
           delete Srv ;                       // usunięcie obiektu 
           return true ;
         }
        }
 

Przede wszystkim zarządzanie pamięcią masz zjechane , może użyj std::string lub jak char* to przydzielane new .
Event wywal to delete z kodu jeśli masz zamiar operować na statycznych napisach .

#include <vector>
#include <iostream>
using namespace std ;
 
int main(int argc, char* argv[])
{
 
        std::vector<char *> Lines;
        std::vector<char *>::iterator lit;
 
        char * test = "trzydwajeden";
        Lines.push_back(test);
 
        lit = Lines.begin();
 
        while(lit != Lines.end())
        {
 
                lit = Lines.erase(lit);
 
        }
      cout << "ok" << endl ;
      cin.get();
 
}

edytowany 14x, ostatnio: dzejo, 2011-08-27 08:13

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0