Ich hoffe es wird sich hier ein findiger C++ guru finden der mir bei dem kleinen Problem helfen kann.
Ich speichere Sound-ressourcen in einer Map (Als pointers). Der Code schaut in etwa so aus:
Alles anzeigen
Die wichtigsten stellen sind eben die erstellung des Smart Pointers und das hinzufügen zur map.
Nun, wenn ich versuche ein Element aus der Map zu entfernen, crasht das Programm.
Das ist der Code der das zum crashen bringt:
Alles anzeigen
Manchmal passiert es beim ersten aufruf, aber manchmal auch erst beim 2ten oder 3ten.
Gibt es irgendeine Regelung mit (Smart)-pointern die ich noch nicht realisiert habe? Muss ich irgendetwas beachten wenn ich diese mit Datenstrukturen wie maps verwende? (Scoping, referenzen die irgendwo irgendwie noch erstellt werden, etc...)
/Edit:
Ok, ich bin dem Problem auf die schliche gekommen. Bei mir war der Code richtig. Die crashes wurden von Audiere ausgelöst.
Wenn ich auf eine Ressource zugreife, kurz bevor sie dereferenziert wird kann ein Crash passieren.
Audiere hat einen eigenen Thread der die Soundengine updated. Wenn ich einen Ressource verändere (z.B: diese Stoppe) wird der stop-befehl in eine Queue im Audiere Thread eingefügt.
Nun, der Stop-befehl wird dadurch mit einer leichten verzögerung ausgeführt. (da ein anderer Thread dafür verantwortlich ist.)
Wenn ich also nun dereferenziere (=das objekt wird gelöscht), könnte es sein dass der Stop-befehl in der Queue noch nicht abgearbeitet wurde.
Wenn der Stop-befehl ausgeführt wird und das objekt nicht mehr existiert für das der Stop-befehl gedacht war dann crasht das ganze...
Ich speichere Sound-ressourcen in einer Map (Als pointers). Der Code schaut in etwa so aus:
Quellcode
- GMEXPORT double streamLoad(char * filename){
- if(emptyStreamIDs.empty() == false){//if there are still IDs available
- if(fexists(filename) == true){
- //loading new music
- std::string stringFilename(filename);
- OutputStreamPtr musicStream = OpenSound(device, stringFilename.c_str(), true);//Load Ressource (Pointer)
- //add to map
- std::set<int>::iterator it = emptyStreamIDs.begin();//get next free ID
- int streamID = *it;//get the content of the iterator and store it
- streamMap.insert(std::pair<int,OutputStreamPtr>(streamID,musicStream));// Insert Ressource into Map
- emptyStreamIDs.erase(streamID);//erases ID so it isn't available anymore
- return streamID;
- }else{
- return -3;//file doesn't exist
- }
- }else{
- //erlse return errorcode (all IDs are used up)
- return -2;
- }
- }
Die wichtigsten stellen sind eben die erstellung des Smart Pointers und das hinzufügen zur map.
Nun, wenn ich versuche ein Element aus der Map zu entfernen, crasht das Programm.
Das ist der Code der das zum crashen bringt:
Quellcode
- GMEXPORT double streamDelete(double ID){
- if(isStreamIDinRange((int)ID)){
- if(streamMap.count((int)ID) >= 1){//check if the key exists at all
- //stop if the stream is playing right now
- streamMap[(int)ID]->stop();
- //erase streamID
- std::map<int,OutputStreamPtr>::iterator it = streamMap.find((int)ID);
- streamMap.erase(it); ///<<<----- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Das hier bringt alles zum absturz.
- //add ID to the set-datastructure so it is available
- emptyStreamIDs.insert((int)ID);
- return 1;
- }else{
- return -1;
- }
- }else{
- return -1;
- }
- }
Manchmal passiert es beim ersten aufruf, aber manchmal auch erst beim 2ten oder 3ten.
Gibt es irgendeine Regelung mit (Smart)-pointern die ich noch nicht realisiert habe? Muss ich irgendetwas beachten wenn ich diese mit Datenstrukturen wie maps verwende? (Scoping, referenzen die irgendwo irgendwie noch erstellt werden, etc...)
/Edit:
Ok, ich bin dem Problem auf die schliche gekommen. Bei mir war der Code richtig. Die crashes wurden von Audiere ausgelöst.
Wenn ich auf eine Ressource zugreife, kurz bevor sie dereferenziert wird kann ein Crash passieren.
Audiere hat einen eigenen Thread der die Soundengine updated. Wenn ich einen Ressource verändere (z.B: diese Stoppe) wird der stop-befehl in eine Queue im Audiere Thread eingefügt.
Nun, der Stop-befehl wird dadurch mit einer leichten verzögerung ausgeführt. (da ein anderer Thread dafür verantwortlich ist.)
Wenn ich also nun dereferenziere (=das objekt wird gelöscht), könnte es sein dass der Stop-befehl in der Queue noch nicht abgearbeitet wurde.
Wenn der Stop-befehl ausgeführt wird und das objekt nicht mehr existiert für das der Stop-befehl gedacht war dann crasht das ganze...
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von LEWA ()