2016-05-07 13 views
-1

Dies ist meine Queue Erklärung hierC++ Queue Fehler

// TODO: Declare a queue here - e.g. as a global variable 
queue<string>myQueue; 

Dieses hier ist, wo ich mein Problem denken ist. Wenn ich das Programm ausführe, erhalte ich einen Fehler, der besagt, dass "deque iterator nicht dereferenzierbar ist".

string receiveMessage() 
{ 
    string messageValue = noMessage; // Don't change this value unless there is a message - default is improtant 

    messageQueueMutex.lock(); 
    try 
    { 
     // TODO: Set hasMessages to true if your queue is not empty, otherwise set it to false: 
     if(!myQueue.empty()) 
     { 
      bool hasMessages = true; 
     } 
     else 
     { 
      bool hasMessages = false; 
     } 

      // TODO: Remove the first message from your queue and place it in messageValue: 
      messageValue = myQueue.front(); 
      myQueue.pop(); 

    } 
    catch (...) 
    { 
     cout << "Exception occurred - check your code!" << endl; 
    } 
    messageQueueMutex.unlock(); 

    return messageValue; 
} 

Antwort

2

Sie müssen unlock() hier nicht verwenden, std::mutex wird automatisch entsperrt, wenn es den Gültigkeitsbereich verlässt. Außerdem ist hasMessages nicht zugänglich, nachdem die if-else-Anweisung b/c in den Bereichen der if-else-Anweisung deklariert wurde. So müssen Sie tun:

bool hasMessages; 

if(!myQueue.empty()) 
{ 
    hasMessages = true; 
} 
else 
{ 
    hasMessages = false; 
} 
1

Wenn die Warteschlange leer ist, versucht dieser Code immer noch, das erste Element aus der Warteschlange zu entfernen. Wenn Sie mir nicht glauben, nur ask your rubber duck.

Dies ist natürlich ein undefiniertes Verhalten.