Przedziwny błąd kompilatora - przeszukiwanie tekstu

0

Witam. Mam gigantyczny plik xml w którym mam duuuużo linii tego typu:


<way id=\"43384691\" version=\"2\" timestamp=\"2009-11-11T12:24:47Z\" uid=\"190309\" user=\"szilderus\" changeset=\"3089569\">
<nd ref=\"546479508\"/>
<nd ref=\"546479541\"/>
<nd ref=\"546479773\"/>
<nd ref=\"546479677\"/>
<nd ref=\"546479508\"/>
<tag k=\"addr:housenumber\" v=\"10\"/>
<tag k=\"building\" v=\"yes\"/>
</way>
    

Teraz chcę sobię wybrać wszystkie liczby które są w ref="ta_liczba". Robię to za pomocą poniższej funkcji

vector <string> Parser::get_value(string name, string line)
{
    vector <string> result;
    int i, end;
    
    while(line.find(name) != string::npos)
    {
	i = line.find(name) + name.size() + 2;
	end = i;
	while(line[end] != '"')
	{
	    end++;
	}
	result.push_back(line.substr(i, end-i));
	line.erase(line.begin(), line.begin()+end);
    }
    return result;
}

//i wywolanie w glownym programie
vector <string> nds = this->get_value("ref", new_line);
//tu cos robie
nds.clear();
new_line.clear();

Gdy robię to w osobnym testowym pliku.cpp dla tego jednego przykładu powyżej, ładnie znajduje te liczby i wypisuje ale gdy wlepiam to do głównego programu wywala mi błąd

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_S_create
Przerwane

Co się dzieje?

0

Jak sam komunikat wskazuje, odpalono terminate, co jest skutkiem tego, że nie złapano rzuconego wyjątku.

Jeżeli nie wiesz o co chodzi, poczytaj o obsłudze sytuacji wyjątkowych, oraz co takiego konkretnie rzuca std::lenght_error.

A sama sytuacja wyjątkowa mogła nastąpić np. wskutek za dużej długości stringa.

0

Zastąpiłem vector kolejką i wywaliło takie cudo

*** glibc detected *** ./main: free(): corrupted unsorted chunks: 0x0bdc88b0 ***
======= Backtrace: =========
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x6e3e1)[0xb74be3e1]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x6fc48)[0xb74bfc48]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(cfree+0x6d)[0xb74c2cfd]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb763e26f]
./main[0x804e79e]
./main[0x804cdc2]
./main[0x804bee8]
./main[0x804b15c]
./main[0x804af21]
./main[0x804a98c]
./main[0x804a01e]
./main[0x804ae0d]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb7466e46]
./main[0x80496e1]
======= Memory map: ========
08048000-08057000 r-xp 00000000 08:11 1061740    /home/mateusz/Pulpit/Studia/C++/Projekt 4/main
08057000-08058000 rw-p 0000f000 08:11 1061740    /home/mateusz/Pulpit/Studia/C++/Projekt 4/main
09191000-0c6d1000 rw-p 00000000 00:00 0          [heap]
b7300000-b7321000 rw-p 00000000 00:00 0 
b7321000-b7400000 ---p 00000000 00:00 0 
b744e000-b7450000 rw-p 00000000 00:00 0 
b7450000-b75a6000 r-xp 00000000 08:11 658197     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b75a6000-b75a7000 ---p 00156000 08:11 658197     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b75a7000-b75a9000 r--p 00156000 08:11 658197     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b75a9000-b75aa000 rw-p 00158000 08:11 658197     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b75aa000-b75ad000 rw-p 00000000 00:00 0 
b75ad000-b75c9000 r-xp 00000000 08:11 654084     /lib/i386-linux-gnu/libgcc_s.so.1
b75c9000-b75ca000 rw-p 0001b000 08:11 654084     /lib/i386-linux-gnu/libgcc_s.so.1
b75ca000-b75cb000 rw-p 00000000 00:00 0 
b75cb000-b75ef000 r-xp 00000000 08:11 658192     /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b75ef000-b75f0000 r--p 00023000 08:11 658192     /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b75f0000-b75f1000 rw-p 00024000 08:11 658192     /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b75f1000-b76d1000 r-xp 00000000 08:11 134665     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17
b76d1000-b76d5000 r--p 000e0000 08:11 134665     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17
b76d5000-b76d6000 rw-p 000e4000 08:11 134665     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17

Sory, ale ja szybciej się nauczę jeśli ktoś mi pomoże niż gdybym miał szukać, termin mnie goni na oddanie tego i siedzę po nocach. Czy jedyną sytuacją taką może być za długi string?

0

Pewnie zastąpiłeś to własną magiczną kolejką która ma segfaulty... Jak my ci mamy pomóc skoro ty sam nie wiesz gdzie jest błąd a znasz kod? o_O
Sam kawałek kodu który pokazałeś jest w porządku. Odpal to jak normalny człowiek pod debugerem i zobacz GDZIE leci ci wyjątek.

0

No tak wiem wiem, myślałem że to może jakiś bug i trzeba to jakoś zastąpić. Piszę pod linuxem a GDB jest zabójczy na razie go nie umiem obsługiwać za bardzo (zbieram się do nauki). Spróbuję jeszcze inaczej zrobić.

0

Już zeby nie robić nowego tematu - jest możliwość alokacji duzego wektora dwuwymiarowego? Gdy alokuję w ten sposób

    vector <int> keys;
    vector <vector <int> > r;
    keys.resize(146884, 0);
    r.resize(146884, keys);

program alokuje bardzo długo i wywala na koniec what() bad alloc.

1

No nie dziwne, bo chcesz stworzyć jedynie 146884 wektorów o pojemności 587536 bajtów każdy. Czyli zaalokować 80 gigabajtów pamięci.

0

Hmm... ale ja chcę stworzyć tylko macierz o tym rozmiarze (implementacja macierzowa grafu). Bez kitu musi się jakoś dać to zrobić, może źle alokuje? Niemożliwe żeby jeden wektor pusty z inta ważył pół mega...

1

Jaki pusty wektor?

Wykonujesz keys.resize(146884, 0); i już masz wektor o pojemności 573 kilobajtów z samymi zerami, który później KOPIUJESZ 146884 razy do nowego wektora.

0

Faktycznie... teraz widzę. To jest jakaś możliwość żebym to jednak zrobił na macierzy czy muszę zmienić metodę implementacji?

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