Segmentation fault Fehler



  • Guten Tag, wenn ich mein Programm ausführe erhalte ich eine "Segmentation fault" meldung und weiss nicht warum.

    main.cpp:

    #include <server.h>
    
    int main()
    {
    Server *Server
    Server->run();
    return 0
    }
    

    server.cpp:

    #include <server.h>
    
    Server::Server()
    {
        bool meinBoolean = false;
    }
    
    Server::~Server()
    {
    
    }
    
    isTrue()
    {
    return meinBoolean;
    }
    
    Server::run()
    {
    isTrue(); //Ich habe es auch schon mit Server::whitelist probiert
    }
    

    Server.h

    #pragma once
    
    class Server
    {
    public:
    
    Server();
    ~Server();
    bool whitelist;
    }
    

    Kennt da jemand das Problem? Verwende CLion mit -std=gnu++0x



  • Nimm keinen Pointer.



  • #include <server.h>
    
    int main()
    {
      Server theServer;
      theServer.run();
    }
    


  • Auch wenn ich keinen Pointer verwende taucht der Fehler auf



  • Dann führst du anderen Code aus als oben steht.



  • an deinem Programm stimmt einiges nicht, angefangen von fehlenden semikolona über unvollständige class definition usw.
    hier mal 'was compilierbares:

    class Server
    {
    public:
    Server();
    ~Server();
    bool whitelist;
      bool isTrue();
      void run();
      bool meinBoolean;
    };
    Server::Server()
    {
        bool meinBoolean = false;
    }
    Server::~Server()
    {}
    
    bool Server::isTrue()
    {
    return meinBoolean;
    }
     void Server::run()
    {
    isTrue();
    }	
    int main()
    {
      Server *server = new Server;
    server->run();
     delete server;
     return 0;
    }
    

    dein seg fault kommt daher, daß du nur einen *Zeiger* namens "Server" (kein guter Name, da die Klasse genauso heißt) anlegst, aber kein Objekt vom 'Typ "Server". dafür mußt du entweder so was wie "Server theServer;" schreiben (wie schon theta schrieb) oder eben "Server *server = new Server;".



  • meinBoolean im CTOR ist immer noch lokal... sollte wohl nicht so sein..



  • Ok vielen Dank allerding steht mir noch die Frage warum ich den Server löschen soll "delete Server" und ob mein retrun auf eine Lokale variable zugreift


  • Mod

    Jonas1999 schrieb:

    Ok vielen Dank allerding steht mir noch die Frage warum ich den Server löschen soll "delete Server" und ob mein retrun auf eine Lokale variable zugreift

    Der von großbuchstaben gezeigte Code ist bloß eine Korrektur deines Codes, so dass er überhaupt compilierbar ist. Es ist keine Korrektur der (großen!) Schwächen und Logikfehler des Codes. Eine "richtigere" Minimalversion wäre:

    class Server
    {
      bool meinBoolean;
      bool whitelist;
    public:
      Server();
      bool isTrue() const;
      void run();  // Soll eventuell auch const sein, je nachdem, was das genau machen soll
    };
    
    Server::Server() : meinBoolean(false) {} // Initialwert für whitelist?
    
    bool Server::isTrue() const
    {
      return meinBoolean;
    }
    
    void Server::run()
    {
      isTrue();
    }  
    
    int main()
    {
      Server server;
      server.run();
    }
    


  • [quote="SeppJ"]

    Jonas1999 schrieb:

    Der von großbuchstaben gezeigte Code ist bloß eine Korrektur deines Codes, so dass er überhaupt compilierbar ist.

    nanana ... er fragte nach dem Problem (seg fault), und mein Code löst das Problem, ohne das Ausgangsprogramm allzusehr zu entstellen.

    deine version ist übrigens auch nicht minimal - eine funktional äquivalente Minimallösung sähe eher so aus

    int main(){}
    

    oder zumindest so

    int main(){return 0;}
    

  • Mod

    großbuchstaben schrieb:

    SeppJ schrieb:

    Der von großbuchstaben gezeigte Code ist bloß eine Korrektur deines Codes, so dass er überhaupt compilierbar ist.

    nanana ... er fragte nach dem Problem (seg fault), und mein Code löst das Problem, ohne das Ausgangsprogramm allzusehr zu entstellen.

    Aber wenn jemand beim Arzt nach Schnupfenmedizin fragt und der Arzt zusätzlich die Pest diagnostiziert, wäre es doch schon ganz nett, wenn der Arzt beide Krankheiten heilt und nicht nur das, wonach gefragt wurde.


Anmelden zum Antworten