Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Segmentation fault, gdy funkcja zwraca vector

Ostatnio zmodyfikowano 2014-01-23 19:57
Autor Wiadomość
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 );

C/C++
std::vector < std::string > Config::getStringValue( std::string path )
{
    // program tu się nawet nie dostaje, gdy tylko wywołam tą funkcję to crashuje
}

P-102332
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]).
P-102333
Chlorek
Temat założony przez niniejszego użytkownika
» 2014-01-16 21:39:25
Proszę bardzo
C/C++
Config config( "config.xml" );
/*std::vector<std::string> result = */ 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.
P-102334
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.
P-102337
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ę:
C/C++
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).
P-102338
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.
P-102383
pekfos
» 2014-01-17 18:40:06
Podaj najprostszy, kompletny kod, w którym występuje problem.
P-102385
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:
C/C++
int main( int argc, const char * argv[] )
{
    // kilka cout i nic innego
    Config config;
    config.open( "config.xml" );
    config.getString( "test/nevermind/something" );
   
    return 0;
}

Cały plik Config.hpp:
C/C++
#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 // _CONFIG_HPP_

No i funkcja z Config.cpp która powoduje błąd:
C/C++
std::vector < std::string > Config::getString( std::string path )
{
    /*if(this->opened)
        {
            pugi::xml_node root = this->xmldoc->root();
   
            std::vector<std::string> results(0);
            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;
        }*/
   
    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).
P-102978
« 1 » 2 3
  Strona 1 z 3 Następna strona