[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_ptrausgefü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::MusicTrackist eine Klasse aus meiner cFabula-Lib, die Instanz desstd::shared_ptr<fabula::MusicTrack>, die mir Probleme bereitet, ist Attribut der Singleton-Klassefabula::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
-
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);