1

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

但是,当我验证我的理解时,它似乎不正确......我使用了这样的东西

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

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

根据front()规范,它应该返回对其持有的第一个元素的引用,如此处所示

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

有什么不对?

谢谢!

4

2 回答 2

3

唯一错误的是您依赖于未定义的行为。它可以工作,也可以崩溃,或者它可以产生下一个 Facebook。对于未定义的行为,一切皆有可能,而您获得了其中一种可能性。

于 2013-06-08T01:58:31.697 回答
1

析构函数运行是正确的,但不需要将字符串归零。它大概会调用operator delete返回字符串占用的内存以供重用。但是指向该内存的指针以及其中的字符可能不会受到影响。

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

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

于 2013-06-08T02:49:36.487 回答