Obsługa wektorów

0

Witam.

Mam problem otóż dotyczmy on vectora którego nie potrafię wprowadzić do mojego programu tak aby nie było błędów naruszenia ochrony pamięci.
Tutaj źródła do programu (chodzi dokładnie o plik main.cpp) :
http://code.google.com/p/minidbxml/source/browse/#svn%2FMiniDBXML-0.0.7%2Fmain
Czy ktoś by mi pomógł wprowadzić je bezboleśnie ? Ponieważ baza danych która ma statycznie zadeklarowany rozmiar tablicy nie nadaje się do normalnej pracy bazy.
Wpadłem na taki sposób wprowadzania i wypełniania tablicy vectorowej"

 

int pre_load()
{


    string* mv = new string;
    int*st_= new int;
    *st_=0;
    int l=0;
    counter_e=0;
    vid=1;
    ifstream*file=new ifstream;
    string*ow=new string;
    *ow=path_db+".xml";
    dane.resize(1);
    file->open(ow->c_str(),ios::in);
    while(!file->eof())
        {
    getline(*file,*mv);
        if(*mv=="<tag>" ){  *st_=1; } else{


        if(mv->length()!=NULL){
            if(*mv=="</tag>")
            {*st_=0; }
            else{
                if(*st_==1){
                    l++;

                dane[0].push_back(mv->substr(4,mv->length()-9));
                parse_xml_tag(mv->substr(4,mv->length()-9),l);
                }
        }
        }
        }
        }


        file->close();
        delete mv;
        delete file;
        delete st_;
        delete ow;
}

int parse_xml_tag(string name_tag_find,int id)
{
    vid=id;
    counter_e=0;
    string*mem=new string;
    string*name_tag=new string;
    *name_tag=name_tag_find;
    string*name_tag_=new string ;
    ifstream*file= new ifstream;
    string*dw=new string;
    *dw=path_db+".xml";
    file->open(dw->c_str(),ios::in);
    while(!file->eof())
    {
      getline(*file,*mem);
      *name_tag_="<"+name_tag_find+">";
      for(int i=0;i<mem->length();i++){
      if(mem->substr(i,i+name_tag_->length())==*name_tag_)
      {
        *name_tag="</"+name_tag_find+">";
          for(int m=i+name_tag_->length();m<mem->length();m++){
              if(mem->substr(m,m+name_tag->length())==*name_tag){
                  counter_e++;
                  dane.resize(counter_e+1);
                   if(counter_e>=max_e){}
                   else{
                   dane[counter_e].push_back(mem->substr(i+name_tag_->length(),m-name_tag->length()+1)) ;
                   }
              }
          }


      }
      }
    }
    file->close();
    delete dw;
    delete file;
    delete mem;
    delete name_tag_;
}

ale no niestety na funkcji int view_database() program się crashuje właśnie z błędem ochrony pamieci.

0

Za to string*mem=new string; powinni Cię skazać na miliard lat ciężkich robót na przepisywaniu z COBOL'a na Malbolge.

0

Aha. A jak rozwiązać ten problem co przedstawiłem ?
Powywalaj wskaźniki. Jeśli nie wszystkie to przynajmniej większość. Twój błąd wynika właśnie ze złego zarządzania pamięcią.
Gdzieś jest błąd, ale w takim kodzie nie ma sensu go szukać: przepisz to normalnie.

string mem;
0

Po co na siłę wszystko alokujesz na stercie? Jak jest zmienna którą stosujesz tylko w danej funkcji (i nie jest ona wielką tablicą) to nie ma sensu bawić się new i delete. To "st_ = new int" to już naprawdę przegięcie.

Po co dajesz kod (na forum), w którym nie ma crush'a? Gdzie tu niby widać: iew_database(), poza narzekaniem, że to tam jest crush?
to co dałeś w linka nie linka (naucz się używać tagów forum).
Ładne spaghetti z tym kodem.
Pokaż gdzie dokładnie jest crush, najlepiej parę wpisów ze szczytu "call stack".

0

Dałem dobry dla porównania (a w ogóle zmieniałem tylko 2 funkcje a reszta pozostała bez zmian). Tam jest funkcja view_database()
A oto te wipsy które pokazują się po uruchomieniu funkcji view_database()

#0 0x1bab47	std::basic_string<char, std::char_traits<char>, std::allocator<char> >::empty() const() (/usr/lib/libstdc++.so.6:??)
#1 0x804c42e	view_database() (/home/administrator/Dokumenty/MiniDBXML/main.cpp:153)
#2 0x804e742	view_menu() (/home/administrator/Dokumenty/MiniDBXML/main.cpp:495)
#3 0x804ee8f	main(argc=1, argv=0xbffff874) (/home/administrator/Dokumenty/MiniDBXML/main.cpp:638) 

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