【发布时间】:2011-01-18 16:28:53
【问题描述】:
在学习 c++ 时,我经历了学习迭代器是什么以及如何使用它们的痛苦。然后,我经历了学习什么函数称为无效迭代器的痛苦,并迅速发现了它们。我最近一直在关注问题,并注意到一个非常常见的主题是人们没有意识到调用vector::erase()会使迭代器无效。这让我想知道是否存在 vector 的 em>调试实现 runtime 检查向量的有效性?
我最初的想法是它必须是一个围绕向量的包装器,它基本上跟踪所有现有的迭代器,并在执行使它们无效的操作时设置一个 isValid 布尔值。然后,在取消引用或递增时,可以检查isValid。
这将有助于诊断更隐蔽的错误,其中erase() 调用嵌套(意外或不知不觉地)在函数调用的深处,而同一向量正在迭代。
有谁知道这样的实现,或者有什么不应该使用的原因?
编辑:我正在使用 linux 和 g++。
【问题讨论】:
-
...哦,在一些可以通过阅读文档来避免的事情上扔掉很多多余的技术... ;)
-
@Nim:我同意,但是会犯错误,在调试过程中发现它们比在生产中崩溃时说“他应该阅读文档”更可取。
-
@JaredC,出于同样的原因发明了单元测试...... ;) 我完全不喜欢在测试和生产中运行“特殊代码”的想法......
-
@Tometzky:这太疯狂了。当需要
erase()时,使用vector有完全正当的理由。 -
@Nim:不,单元测试是为了测试你的一小段代码而发明的。它们不一定能帮助您检测您是否使用了无效的迭代器,部分原因是它可能经常似乎工作,尤其是在单元测试等简单的上下文中。调试时没有理由不启用额外的错误检查。
标签: c++ debugging vector iterator