Chlorek Temat założony przez niniejszego użytkownika |
Segmentation fault, gdy funkcja zwraca vector » 2014-01-16 21:30:07 Problem jak w temacie. Mam w klasie metodę, która zwraca vector<std::string>. Nawet jeśli ta funkcja jest pusta (nic się w niej nie wykonuje) to samo jej wywołanie od razu powoduje crash aplikacji. Debuger nie wskazuje na nic konkretnego - jedynie podaje, że wystąpił segmentation fault. std::vector < std::string > getStringValue( std::string path ); std::vector < std::string > Config::getStringValue( std::string path ) { } |
|
Admixior |
» 2014-01-16 21:36:07 Podaj jak wywołujesz te funkcję (i użyte przy tym zmienne pomocnicze [definicje, i przypisanie wartości]). |
|
Chlorek Temat założony przez niniejszego użytkownika |
» 2014-01-16 21:39:25 Proszę bardzo Config config( "config.xml" ); config.getStringValue( "test/nevermind\\something" ); Dokładnie tak mam aktualnie w kodzie. #Edit Jak przerobię kod tak by zwracał mi np. std::array to ten błąd nie występuje. Niezależnie od tego jakie zmiany wprowadzam to po prostu nawet w prostym testowym programie doprowadzona to do takiego błędu, gdy chcę zwrócić vector. |
|
pekfos |
» 2014-01-16 21:54:02 Nawet jeśli ta funkcja jest pusta (nic się w niej nie wykonuje) to samo jej wywołanie od razu powoduje crash aplikacji. |
Nic dziwnego. Nie może być pusta. |
|
Chlorek Temat założony przez niniejszego użytkownika |
» 2014-01-16 21:59:37 Gdy jest zapełniona odpowiednim kodem i ZWRACA żądany vector crash też występuje. Po prostu chciałem podkreślić, że nie jest to wina kodu zawartego w niej. Ale skoro jest tak istotny no to proszę: std::vector < std::string > Config::getStringValue( std::string path ) { if( this->opened ) { pugi::xml_node root = this->xmldoc->root(); std::vector < std::string > results( 1 ); std::vector < std::string > nodes; boost::split( nodes, path, boost::is_any_of( "/\\" ) ); for( std::string node: nodes ) { if( node != nodes[ nodes.size() - 1 ] ) root = root.child( node.c_str() ); else for( pugi::xml_node target = root.child( node.c_str() ); target; target = target.next_sibling( node.c_str() ) ) results.push_back( target.child_value() ); } return results; } return std::vector < std::string >( 0 ); } Jeśli zauważycie jakieś rażące błędy to również poproszę o informację (wiem za to że moje porównanie "node != nodes[]" może zawieść w pewnych sytuacjach). |
|
Chlorek Temat założony przez niniejszego użytkownika |
» 2014-01-17 18:37:17 Coś ktoś wie? Problem jest na 100% w tym vectorze, bo jak wspomnialem w drugim testowym programie mam to samo i żadnego innego kodu. |
|
pekfos |
» 2014-01-17 18:40:06 Podaj najprostszy, kompletny kod, w którym występuje problem. |
|
Chlorek Temat założony przez niniejszego użytkownika |
» 2014-01-23 18:16:47 Oh, ostatnio miałem trochę braki czasu i projekt stał wraz z moim problemem. W każdym razie powróciłem do wątku. Najprostszy kod... nie ma sensu myślę wstawiania, gdyż to po prostu klasa w której metoda zwraca vector string'ów (aczkolwiek vector innych typów - w tym prostych, powoduje ten sam błąd). Ale skoro może się to okazać przydatne to wstawię. A swoją drogą GDB wyrzuca mi coś takiego: Program received signal SIGSEGV, Segmentation fault. In ?? () () A jak patrzę na cały trace to również nic ciekawego, a właściwie to mam to: #0 0040BDC8 ?? () (??:??) #1 00492424 ?? () (??:??) #2 004010FD ?? () (??:??) #3 779C9ED2 ntdll!RtlInitializeExceptionChain() (C:\Windows\system32\ntdll.dll:??) #4 779C9EA5 ntdll!RtlInitializeExceptionChain() (C:\Windows\system32\ntdll.dll:??) #5 ?? ?? () (??:??)
Mój aktualny prawie pełny kod: int main( int argc, const char * argv[] ) { Config config; config.open( "config.xml" ); config.getString( "test/nevermind/something" ); return 0; } Cały plik Config.hpp: #ifndef _CONFIG_HPP_ #define _CONFIG_HPP_
#include "addlib/pugixml.hpp"
#include <boost/lexical_cast.hpp> #include <boost/algorithm/string.hpp> #include <string> #include <vector>
class Config { public: Config(); Config( std::string path ); ~Config(); std::vector < std::string > getString( std::string path ); bool setString( std::string path, std::string value, bool addNewValue ); bool open( std::string path ); bool save(); bool isOpened(); pugi::xml_document * getXMLDocument(); private: bool opened; std::string filePath; pugi::xml_document * xmldoc; };
#endif
No i funkcja z Config.cpp która powoduje błąd: std::vector < std::string > Config::getString( std::string path ) { std::vector < std::string > nothingness( 1 ); return nothingness; } Cały program obciąłem tak by nie robił już nic innego jak tylko wywoływał tą funkcję (więc nie widzę jakichkolwiek innych możliwości, poza tym zmiana zwracanego typu pomaga, ale nie jest to dla mnie rozwiązaniem - chcę zrozumieć ten błąd i go naprawić). Nie ma już nic więcej do wstawienia, to dosłownie wszystko co teraz się wykonuje w moim programie (dla pewności wywaliłem wszystkie pliki .o i zrobiłem rebuild). |
|
« 1 » 2 3 |