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

C++ C++;std::queue pop()和析构函数,c++,containers,std,C++,Containers,Std,我最初认为,当一个队列被破坏时(例如,当它超出范围时),那么所包含的元素应该被破坏(通过调用它们各自的析构函数)。类似地,调用pop()时,队列中的第一个元素将被破坏,队列大小将减少1 然而,当我验证我的理解时,它似乎是不正确的。。。我用过这样的东西 string& str = myQueue.front(); myQueue.pop(); (其中myQueue是包含字符串的非空队列) 根据front()spec,它应该返回对它所持有的第一个元素的引用 这意味着,当我弹出队列时,第一个

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

然而,当我验证我的理解时,它似乎是不正确的。。。我用过这样的东西

string& str = myQueue.front();
myQueue.pop();
(其中myQueue是包含字符串的非空队列)

根据
front()
spec,它应该返回对它所持有的第一个元素的引用

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

有什么不对劲吗


谢谢

唯一的错误是你依赖于未定义的行为。它可能会工作,也可能会崩溃,也可能会产生下一个Facebook。任何事情都有可能发生在未定义的行为中,你得到了其中一种可能性。

唯一错误的是你依赖于未定义的行为。它可能会工作,也可能会崩溃,也可能会产生下一个Facebook。使用未定义的行为,任何事情都是可能的,您得到了一种可能性。

析构函数运行是正确的,但不需要将字符串归零。它可能会调用
操作符delete
,以返回字符串占用的内存以供重用。但指向该内存的指针以及其中的字符可能未被触及

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


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

析构函数运行是正确的,但不需要将字符串归零。它可能会调用
操作符delete
,以返回字符串占用的内存以供重用。但指向该内存的指针以及其中的字符可能未被触及

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


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

你怎么知道它是有效的?我打印了“str”,它仍然在那里。这不是有效性的证明。这只是意味着打印功能找到了字符并输出了它们。你怎么知道它是有效的?我打印出了“str”,但它仍然存在。这不是有效性的证明。这仅仅意味着打印功能找到了字符并设法输出它们。我们是否看到所有其他std容器都有相同的行为?i、 当我们调用它的remove函数时,或者当一个包含被销毁时(比如说,当超出范围时),它的内容就会通过它们的析构函数被销毁?是的,所有容器都是这样的。我们看到所有其他std容器都有相同的行为吗?i、 当我们调用它的remove函数时,或者当一个包含被销毁时(比如说,当超出范围时),那么它的内容就会通过它们的析构函数被销毁?是的,所有的容器都是这样做的。