C ++ std :: queue pop()和析构函数

时间:2013-06-08 01:47:37

标签: c++ containers std

我最初认为当队列被破坏时(例如当它超出范围时),则应该破坏所包含的元素(通过调用它们各自的析构函数)。类似地,当调用pop()时,队列中的第一个元素被破坏,队列的大小减少1.

然而,当我验证我的理解时,它似乎不正确......我使用了类似的东西

string& str = myQueue.front();
myQueue.pop();

(其中myQueue是一个包含字符串的非空队列。)

根据front()规范,它应该返回对它所拥有的第一个元素的引用as seen here

这意味着,当我弹出队列时,第一个元素就消失了。事实证明“str”之后仍然是一个有效的字符串!

有什么不对吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

唯一不对的是你依赖于未定义的行为。它可以工作,或者可能崩溃,或者它可以产生下一个Facebook。任何事情都可能出现未定义的行为,你就有了其中一种可能性。

答案 1 :(得分:1)

析构函数运行是正确的,但不需要将字符串清零。它可能会调用operator delete来返回字符串占用的内存以供重用。但是指向该内存的指针及其中的字符可能保持不变。

C ++主要是为了提高性能而设计的。如果库不需要在运行时执行某些操作,则可能不会。您可能有一个可以激活的调试模式,这可能导致该程序出现运行时问题,但它也会降低执行速度并可能消耗额外的内存。

捕获此类错误的一个好工具是Valgrind。它在透明的虚拟机中运行您的程序,并跟踪mallocfree调用,并告诉您是否访问了无效或未初始化的内存。