C++ 队列错误
C++ Queue error
这是我的队列声明
// TODO: Declare a queue here - e.g. as a global variable
queue<string>myQueue;
这就是我认为我的问题所在。每当我 运行 程序时,我都会收到一条错误消息 "deque iterator not dereferencable."
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;
}
如果队列为空,此代码仍会尝试从队列中删除第一个元素。不信就ask your rubber duck.
这当然是未定义的行为。
这里不需要使用unlock()
,std::mutex
超出范围会自动解锁。此外,hasMessages
在 if-else 语句 b/c 之后将不可访问,它在 if-else 语句的范围内声明。所以,你需要做:
bool hasMessages;
if(!myQueue.empty())
{
hasMessages = true;
}
else
{
hasMessages = false;
}
这是我的队列声明
// TODO: Declare a queue here - e.g. as a global variable
queue<string>myQueue;
这就是我认为我的问题所在。每当我 运行 程序时,我都会收到一条错误消息 "deque iterator not dereferencable."
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;
}
如果队列为空,此代码仍会尝试从队列中删除第一个元素。不信就ask your rubber duck.
这当然是未定义的行为。
这里不需要使用unlock()
,std::mutex
超出范围会自动解锁。此外,hasMessages
在 if-else 语句 b/c 之后将不可访问,它在 if-else 语句的范围内声明。所以,你需要做:
bool hasMessages;
if(!myQueue.empty())
{
hasMessages = true;
}
else
{
hasMessages = false;
}