我最初认为当队列被破坏时(例如当它超出范围时),则应该破坏所包含的元素(通过调用它们各自的析构函数)。类似地,当调用pop()时,队列中的第一个元素被破坏,队列的大小减少1.
然而,当我验证我的理解时,它似乎不正确......我使用了类似的东西
string& str = myQueue.front();
myQueue.pop();
(其中myQueue是一个包含字符串的非空队列。)
根据front()
规范,它应该返回对它所拥有的第一个元素的引用as seen here。
这意味着,当我弹出队列时,第一个元素就消失了。事实证明“str”之后仍然是一个有效的字符串!
有什么不对吗?
谢谢!
答案 0 :(得分:3)
唯一不对的是你依赖于未定义的行为。它可以工作,或者可能崩溃,或者它可以产生下一个Facebook。任何事情都可能出现未定义的行为,你就有了其中一种可能性。
答案 1 :(得分:1)
析构函数运行是正确的,但不需要将字符串清零。它可能会调用operator delete
来返回字符串占用的内存以供重用。但是指向该内存的指针及其中的字符可能保持不变。
C ++主要是为了提高性能而设计的。如果库不需要在运行时执行某些操作,则可能不会。您可能有一个可以激活的调试模式,这可能导致该程序出现运行时问题,但它也会降低执行速度并可能消耗额外的内存。
捕获此类错误的一个好工具是Valgrind。它在透明的虚拟机中运行您的程序,并跟踪malloc
和free
调用,并告诉您是否访问了无效或未初始化的内存。