std::queue

std::queue 是 stl 里面的容器适配器, 用来适配FIFO的数据结构。

std::queue, 入队列的方法是: std::queue::push(),

出队列的方法是: std::queue::pop(), 为了异常安全, 这个方法返回void, 所以通常调用std::queue::front(), 查看队列头部的元素, 然后调用std::queue::pop(), 让元素出队列.

 

  今天在写一个服务器程序的时候,发现请求量大的时候,程序发生崩溃,原因是我传入某个函数的string的size()过大。
这个程序是一个典型的生产者/消费者:生产者产生的信息放入 string,然后加锁放入std::queue中;消费者线程加锁,从std::queue.front()中获得对象的应用,然后pop()队头元素。一切看起来都是那么清晰简单。
消费者的代码看起来就像是这样:

为什么从队列取出string后,size就变了?
试了很多种方法,最后只删除了一个符号,程序就正常了:

通过上面的问题的解决,我了解了:原来queue的pop()方法会调用string的析构函数,引用指向一个已经析构的对象,当然会出错。
真的是这样吗?我又做了如下的三个实验:
//--------------------- test_queue_pop.cpp-----------------------------

为什么呢?为什么pop()仅仅只在多线程环境下才调用对象的析构函数?这只能理解为stl的bug了。
还好,总是使用operator=就好!

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值