在学习 C++ 时,我经历了学习什么是迭代器以及如何使用它们的痛苦。然后,我经历了学习什么函数调用无效迭代器的痛苦,并快速发现它们。我最近一直在关注问题,并注意到一个非常普遍的主题是人们没有意识到调用vector::erase()
会使迭代器无效。 这让我想知道是否有vector
的调试实现 运行时 检查 vector 有效性?
我最初的想法是,它必须是 vector 的包装器,基本上跟踪所有现有的迭代器,并在执行使它们无效的操作时设置 isValid
bool 值。然后,在取消引用或递增时,可以检查 isValid
。
这将有助于诊断更隐蔽的错误,其中 erase()
调用嵌套(意外或无意地)在函数调用的深处,而同一 vector 正在迭代。
有没有人知道这样的实现,或者为什么不应该使用它的任何原因?
编辑:我正在使用 linux 和 g++。
最佳答案
Microsoft 的实现会进行一些调试检查(ref 和 ref)。它专门检查范围,所以我不确定 erase() 场景是否适合。
编辑 jalf 的贡献:
GCC(和 g++)似乎具有类似的功能:
关于C++ vector 调试实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4726428/