c++ - 我如何处理队列前端和弹出功能

标签 c++ multithreading memory stl queue

我在 C++ 引用和队列头文件中读到,queue.front() 函数返回一个引用。 queue.pop() 似乎删除了队列中的该元素。

在我的例子中,队列存储字符串(消息),有一个类在队列中存储一些字符串,并且一些线程调用一个看起来像这样的函数

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() 返回的引用进行初始化的。一旦该运算符返回,分配就完成了。您现在拥有该字符串的两个拷贝。在 .pop 之后,原来的内容消失了,但 line 仍然保留其值。

关于c++ - 我如何处理队列前端和弹出功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28042436/

相关文章:

c++ - 在语义 Action 中 boost spirit 改变变量值

python - 带线程的交互式脚本

iphone - 如何让一段代码在单独的线程中运行?

c# - 在不能保证获取锁的顺序时避免死锁

java - 关闭 JavaFX Stage 后如何释放内存?

c++ - Boost 智能指针和非 POD 类型 (C++)

c++ - SHFileOperation/SHFILEOPSTRUCT

c++ - 使用 Bison 将数据解析为结构

c++ - 在单例类中将成员指针设置为 null 的正确方法是什么

c++ - 内存分配错误 new char [n]