2009-07-26 24 views
17

Podczas pracy mój program otrzymuję ten błąd:Jaki jest sens tego C++ Błąd std :: length_error

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

wiem, że nie można zrobić wiele bez kodu, ale myślę, że to jest błąd zbyt głęboko w kodzie, aby go skopiować. Może uda mi się to zrozumieć, jeśli rozumiem, co oznacza ten błąd. Czy to oznacza problem z odczytaniem lub zapisaniem pod niewłaściwym adresem pamięci?

Czy jest coś, co mogę zrobić, aby uzyskać więcej informacji o problemie z mojego programu?

+0

Czy można opublikować fragment kodu, do którego uzyskujesz dostęp do ciągu znaków? –

+1

Ciąg nie jest problemem. Po drobnych zmianach i dodaniu komunikatów do debugowania dostaję prawdziwą segfault;) – Janusz

+1

Oprócz odpowiedzi Kevina: Może zrobiłeś kilka obliczeń, które prowadziłyby do ujemnej długości łańcucha? Ponieważ długość ciągu jest (zwykle) zapisywana jako wartość unsigned, twoja wartość ujemna prowadziłaby do bardzo dużej wartości dodatniej, która jest większa niż std :: string :: max_size()! – mmmmmmmm

Odpowiedz

20

Oznacza to, że próbowałeś utworzyć łańcuch większy niż std :: string :: max_size().

http://msdn.microsoft.com/en-us/library/as4axahk(VS.80).aspx

An exception of type length_error Class is thrown when an operation produces a string with a length greater than the maximum size.

+2

Czy to też może oznaczać, że mój ciąg nie jest już w pamięci i czytam losowe śmieci z pamięci, dopóki ciąg nie jest zbyt duży? – Janusz

+14

Możesz utworzyć tę sytuację przypadkowo, próbując utworzyć ciąg o rozmiarze -1. Rozmiary łańcuchów są niepodpisane, więc -1 jest w rzeczywistości największą możliwą liczbą całkowitą bez znaku. – MSalters

0

Jest to błąd w trybie debugowania z VS2005. Kiedy zmieniam go na tryb zwolnienia, wszystko działa.

Cóż, środowisko wykonawcze debugowania vc to powoduje, to wszystko.

+4

Witamy w StackOverflow i dzięki za publikację. Proszę spojrzeć na [How to Answer] (http://stackoverflow.com/questions/how-to-answer). –

+0

Przełączanie z wersji debugowania na wersję działało również dla mnie, ale w wersji 64-bitowej VS2008. Zawodziło, gdy debugger trafił na linię, która stworzyła bardzo duży obiekt macierzy. Domyślam się, że starał się przydzielić wystarczającą ilość miejsca, aby wyświetlić macierz jako ciąg znaków, a to spowodowało awarię. – partofthething

1

Wiem, że to stare pytanie, ale właśnie wpadłem na ten sam problem. Używanie systemu Linux z gcc.

Demontaż funkcji pokazał wiele skoków w kodzie, gdzie został zgłoszony wyjątek, którego tam nie powinno być. Ostatecznie Clean Build rozwiązał problem dla mnie.