【问题标题】:C++ vector debug implementationC++向量调试实现
【发布时间】: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


【解决方案1】:

Microsoft 的实现会进行一些调试检查(refref)。它专门检查范围,所以我不确定 erase() 场景是否合适。

编辑 jalf 的贡献:

GCC(和 g++)似乎具有类似的功能:

stackoverflow.com/questions/2567997/

gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html

【讨论】:

【解决方案2】:

这可以在 Microsoft STD 库实现中找到..

当一个迭代器失效时,这意味着使用它来访问一个元素会导致运行时错误,就像你想要的那样......

【讨论】:

  • 当前行为不是未定义,不是总是运行时错误吗?
  • @JaredC:是的,标准规定的行为只是“未定义”(或者更准确地说,标准没有规定任何行为)。不需要运行时错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多