[Solved] Destruktor von std::shared_ptr führt zu SIGSEGV



  • Guten Morgen,

    ich habe das Problem, dass ich, wie der Titel bereits verrät, einen SIGSEGV erhalte, wenn der Destruktor eines bestimmten std::shared_ptr ausgeführt wird.

    Zunächst einmal die Ausgabe von Valgrind:

    ==6529== Process terminating with default action of signal 11 (SIGSEGV)
    ==6529== Bad permissions for mapped region at address 0x3034C03660
    ==6529== at 0x3034C03660: ???
    ==6529== by 0x4056D1: std::_Sp_counted_ptr<fabula::MusicTrack*, (__gnu_cxx::_Lock_policy)2>::_M_dispose() (shared_ptr_base.h:147)
    ==6529== by 0x405BB8: std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() (shared_ptr_base.h:147)
    ==6529== by 0x4C34820: std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() (in /usr/local/lib/libFabula.so)
    ==6529== by 0x4C3ED4D: std::__shared_ptr<fabula::MusicTrack, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() (in /usr/local/lib/libFabula.so)
    ==6529== by 0x4C3ED67: std::shared_ptrfabula::MusicTrack::~shared_ptr() (in /usr/local/lib/libFabula.so)
    ==6529== by 0x4C3ED97: fabula::Music::~Music() (in /usr/local/lib/libFabula.so)
    ==6529== by 0x318B038BB0: __run_exit_handlers (in /usr/lib64/libc-2.15.so)
    ==6529== by 0x318B038C34: exit (in /usr/lib64/libc-2.15.so)
    ==6529== by 0x318B02173B: (below main) (in /usr/lib64/libc-2.15.so)

    fabula::MusicTrack ist eine Klasse aus meiner cFabula-Lib, die Instanz des std::shared_ptr<fabula::MusicTrack> , die mir Probleme bereitet, ist Attribut der Singleton-Klasse fabula::Music .

    Standardmäßig handelt es sich hierbei um einen nullptr , der ausdrücken soll, dass kein Track geladen ist. Der SIGSEGV tritt bei jedem Programmende auf, falls die Instanz erzeugt wurde.

    Hat jemand Ideen, wo der Fehler liegen könnte?

    Mit freundlichen Grüßen,

    Ki

    EDIT:
    Fehler gefunden


  • Mod

    Hat jemand Ideen, wo der Fehler liegen könnte?

    In deinem Programm.

    Für bessere Antworten: Minimalbeispiel erzeugen. Siehe dritter Link in meiner Signatur.



  • Im Programm liegt der Fehler nicht, so viel weiß ich, er liegt in der Lib und den Code, der dort relevant ist, umschrieb ich verbal. Aber wenn du es unbedingt noch einmal in Codeform haben willst, weil du den Text nicht rekonstruieren kannst, bitte sehr:

    class Music final
    {
        // VARIABLES
        std::shared_ptr<MusicState> state_;
        std::shared_ptr<MusicTrack> track_; //XXX: Kopie statt Pointer? 
    
        // SINGLETON
        Music();
        ~Music(){};
        Music(const Music&) = delete;
        Music& operator=(const Music&) = delete;
        Music(Music&&) = delete;
        Music& operator=(Music&&) = delete;
    
        public:
            // Ausgabe der Instanz und diverse Methoden
    };
    
    Music::Music()
        : state_(new MusicFree)
        , track_(nullptr)
    {}
    

    Anwendungsbeispiel:

    std::shared_ptr<fabula::MusicTrack> track
        (new fabula::MusicTrack(".music/theme.ogg"));
    fabula::Music::music().setTrack(track);
    

Anmelden zum Antworten