Segfault durch externe Definition



  • Hallo,

    ich habe lange nicht mehr mit C++ programmiert, hoffe mein Problem ist simpel. Ich führe mein Programm (GCC 4.7.1 / -std=c++0x) aus und bekomme einen Segfault. Beim GCC 4.6.3 tritt dieser Fehler nicht auf. Ausköser ist die Funktion getEvents() in der folgenden Datei:

    // XXX.h
    #include "events.h"
    
    class Events;
    
    class XXX {
    protected:
       XXX();
    
    public:
       ...
       inline Events&          getEvents()          { return *events;     }
    
    protected:
       Events          *events;
    };
    

    Der Debugger gibt mir dazu folgendes aus:

    Program received signal SIGSEGV, Segmentation fault.
    0x0805cc40 in XXX::getEvents (this=0x0) at XXX.h:50
    50		inline Events&          getEvents()          { return *events;     }
    (gdb) backtrace 
    #0  0x0805cc40 in XXX::getEvents (this=0x0) at XXX.h:50
    #1  0x080657eb in ZZZ::ZZZ (this=0x85c33a8) at ZZZ.cpp:106
    ...
    

    XXX ist also ein Nullpointer. In der XXX.cpp steht nun folgendes:

    // XXX.cpp
    #include "XXX.h"
    #include "events.h"
    
    class YYY;
    extern YYY &yyy;
    
    // YYY.cpp
    #include "YYY.h"
    // Wenn ich an folgender Stelle einen Breakpoint setze, wird hier nicht gestoppt
    YYY &yyy = YYY::getInstance();
    
    // YYY.h
    #include "XXX.h"
    
    class YYY : public XXX
    {
       // Singleton
       ...
    };
    
    extern YYY &yyy;
    

    Der Auflöser in der ZZZ.cpp ist nun der Aufruf von YYY.getEvents(). Dabei ist YYY ein Nullpointer:

    #include "YYY.h"
    
    ZZZ::ZZZ()
    {
       YYY.getEvents();
    }
    

    Ich hoffe ihr könnt mir helfen. Ich bin leider recht ratlos.


  • Mod

    Zeig mal YYY::getInstance().



  • class YYY
    	: public XXX
    	, public Singleton<YYY>
    {
    	friend class Singleton<YYY>;
    
    private:
    	YYY();
    
    public:
    	virtual ~YYY();
    };
    
    extern YYY &yyy;
    
    template <class T>
    class Singleton {
      protected:
    	Singleton() {}
    
      private:
    	Singleton(const Singleton&) {}
    
    public:
    	virtual ~Singleton() {}
    	static T& getInstance();
    
    };
    
    template <class T>
    T& Singleton<T>::getInstance() {
    	static T instance;
    	return instance;
    }
    

  • Mod

    Ist das ZZZ-objekt zufällig auch global?



  • Hm, irgendwie hat sich das Problem gerade von alleine gelöst 😮 Ich habe eigentlich gerade nichts verändert und das Projekt neu gebaut, auf einmal lief es. So ein Mist, ich sitze schon seit dem Wochenende daran und habe es eigentlich schon mehrfach neu gebaut 😕

    Bzgl. deiner Frage, ja das ZZZ-Objekt ist global verfügbar und wird über ein Blackboard-Pattern verwaltet.



  • Michamab schrieb:

    ZZZ-Objekt ist global verfügbar

    Wenn ZZZ auch irgendwo globar definiert ist, dann hast du ein Problem. Denn es ist im Standard nicht definiert in welcher Reihenfolge globale Objekte über verschiedene Übersetzungseinheiten erzeugt werden.

    Der eine machts so, der andere machts anders. Mal funktionierts, mal nicht. Be careful 🙂 und meide globale Objekte.


  • Mod

    Komisches Problem mit statischen globalen Variablen, das mal da ist, mal nicht. Das ist der Lexikoneintrag für das berüchtigte "static initialization order fiasco". Mit diesem Stichwort findet man bei Google leicht Erklärungen und Gegenmaßnahmen.


Anmelden zum Antworten