在学习c ++的过程中,我经历了学习迭代器的痛苦,以及如何使用它们。然后,我经历了学习什么函数调用使迭代器失效并快速发现它们的痛苦。我最近一直在关注问题,并注意到非常常见的主题是人们没有意识到调用vector::erase()
使迭代器无效。这让我想知道是否有vector
的调试实现,它针对向量有效性进行运行时检查?
我最初的想法是它必须是一个基本上跟踪所有现有迭代器的向量包装器,并在执行使它们失效的动作时设置isValid
布尔值。然后,在解除引用或递增时,可以检查isValid
。
这有助于诊断更多模糊的错误,其中erase()
调用在函数调用中嵌套(意外地或不知不觉地),而同一个向量是迭代器。
有没有人知道这样的实现,或者为什么不应该使用它?
编辑:我正在使用linux和g ++。答案 0 :(得分:4)
Microsoft的实现会进行一些调试检查(ref和ref)。它专门检查范围,所以我不确定erase()场景是否适合。
编辑jalf的贡献:
GCC(和g ++)似乎具有类似的功能:
答案 1 :(得分:0)
可以在Microsoft STD库实现中找到..
当迭代器失效时,意味着使用它来访问元素会导致运行时错误,完全符合您的要求....