我如何处理队列前端和弹出功能
how do i deal with the queue front and pop function
我在 c++ 参考和队列头文件中读到 queue.front() 函数 returns 一个参考。
queue.pop() 似乎删除了队列中的那个元素。
在我的例子中,队列存储字符串(消息)有一个 class 在队列中存储一些字符串,一些线程调用一个看起来像这样的函数
pthread_mutex_lock(&this->mutex);
while(this->TEMP.size() == 0){
usleep(10);
}
string line;
line = this->TEMP.front();
this->TEMP.pop();
pthread_mutex_unlock(&this->mutex);
return line;;
}
所以如果它是一个引用,那么调用该函数的线程将会死掉或者发生一些可怕的事情,因为内存在 pop 之前被释放了。
到目前为止我说的对吗???
那我该怎么做呢???
您正在呼叫 line.operator=(std::string& source)
。引用 source
是从 TEMP.front()
返回的引用初始化的。一旦该运算符 returns,赋值就完成了。您现在拥有该字符串的两个副本。在 .pop
之后,原来的消失了,但 line
仍然保持它的价值。
我在 c++ 参考和队列头文件中读到 queue.front() 函数 returns 一个参考。 queue.pop() 似乎删除了队列中的那个元素。
在我的例子中,队列存储字符串(消息)有一个 class 在队列中存储一些字符串,一些线程调用一个看起来像这样的函数
pthread_mutex_lock(&this->mutex);
while(this->TEMP.size() == 0){
usleep(10);
}
string line;
line = this->TEMP.front();
this->TEMP.pop();
pthread_mutex_unlock(&this->mutex);
return line;;
}
所以如果它是一个引用,那么调用该函数的线程将会死掉或者发生一些可怕的事情,因为内存在 pop 之前被释放了。
到目前为止我说的对吗???
那我该怎么做呢???
您正在呼叫 line.operator=(std::string& source)
。引用 source
是从 TEMP.front()
返回的引用初始化的。一旦该运算符 returns,赋值就完成了。您现在拥有该字符串的两个副本。在 .pop
之后,原来的消失了,但 line
仍然保持它的价值。