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ść
pekfos
» 2014-01-23 19:00:13
A jak wywalisz wywołanie open(), konstruktor i destruktor, to działa?
P-102985
Chlorek
Temat założony przez niniejszego użytkownika
» 2014-01-23 19:05:24
Wywołanie open() jeszcze rozumiem ale że niby jak konstruktor? Przecież muszę utworzyć obiekt (a wtedy i wywoła się konstruktor), chyba że metody będą statyczne.
P-102986
pekfos
» 2014-01-23 19:08:54
Przecież muszę utworzyć obiekt
Nie musisz w klasie definiować własnego konstruktora. Miałeś podać kompletny kod wywołujący problem. Po przekopiowaniu tego, co podałeś i dopisaniu kilku pustych metod, kod działa.
P-102987
Chlorek
Temat założony przez niniejszego użytkownika
» 2014-01-23 19:14:13
Ah, zrozumiałem to jako "wywalić wywołanie [...] konstruktor(a)". Wiem, niby nie logicznie ale tak pomyślałem.

W każdym razie, zrobiłem tak jak poleciłeś (wywaliłem konstruktor i destruktor), ale zostawiłem open() - wynik test: wszystko zdaje się działać. Dlaczego?
Mój konstruktor:
C/C++
Config::Config()
{
    this->opened = false;
    this->filePath = "";
}

I drugi konstruktor:
C/C++
Config::Config( std::string path )
{
    this->open( path );
}

Natomiast destruktor jest pusty.
P-102989
pekfos
» 2014-01-23 19:15:39
A destruktor i open()?
P-102990
Chlorek
Temat założony przez niniejszego użytkownika
» 2014-01-23 19:21:09
Napisałem, że destruktor jest pusty. Natomiast funkcja open() wygląda tak:
C/C++
bool Config::open( std::string path )
{
    this->filePath = path;
   
    pugi::xml_parse_result result = this->xmldoc->load_file( filePath.c_str() );
    if( result )
    {
        Mystour::getLogger( LoggerType::Info ).print( "Config file \"" + filePath + "\" loaded successfully!" );
        this->opened = true;
       
        return true;
    }
   
    Mystour::getLogger( LoggerType::Error ).print( "Failed to load/parse config file \"" + filePath + "\"!\n\tDetails: " + result.description() + "\n\tat: " + boost::lexical_cast < std::string >( result.offset ) );
    this->opened = false;
    this->filePath = "";
   
    return false;
}

Jednak wywołanie open() nie powoduje żadnych błędów i program normalnie działa (oczywiście po wywaleniu konstruktorów). Z konstruktorami też nie powoduje crashu, ale już wywołanie getString() tak.
P-102991
Chlorek
Temat założony przez niniejszego użytkownika
» 2014-01-23 19:39:09
Sprawa robi się coraz dziwniejsza, zrobiłem parę poprawek (jedynie kosmetyczne, wywalenie konstruktorów których już nie używam i destruktora) i... przestaje działać program. Tym razem w innym miejscu, mianowicie crashuje w open() w miejscu:
pugi::xml_parse_result result = this->xmldoc->load_file( filePath.c_str() );

Co jest grane? Nie było tu wcześniej jakichkolwiek błędów...

#Edit
Błedu wcześniej nie było (w nic nie ruszałem w tej funkcji), ale postanowiłem nie robić z xmldoc'a wskaźnika i... zadziałało. Dziwne, jak to programowanie czasami jest nie do pojęcia dla mnie...
P-102992
pekfos
» 2014-01-23 19:41:06
A gdzie nadajesz wartość xmldoc?
P-102993
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona