C++向量调试实现

Posted

技术标签:

【中文标题】C++向量调试实现【英文标题】:C++ vector debug implementation 【发布时间】:2011-01-18 16:28:53 【问题描述】:

在学习 c++ 时,我经历了学习迭代器是什么以及如何使用它们的痛苦。然后,我经历了学习什么函数称为无效迭代器的痛苦,并迅速发现了它们。我最近一直在关注问题,并注意到一个非常常见的主题是人们没有意识到调用vector::erase()会使迭代器无效。这让我想知道是否存在 vector 的 em>调试实现 runtime 检查向量的有效性?

我最初的想法是它必须是一个围绕向量的包装器,它基本上跟踪所有现有的迭代器,并在执行使它们无效的操作时设置一个 isValid 布尔值。然后,在取消引用或递增时,可以检查isValid

这将有助于诊断更隐蔽的错误,其中erase() 调用嵌套(意外或不知不觉地)在函数调用的深处,而同一向量正在迭代。

有谁知道这样的实现,或者有什么不应该使用的原因?

编辑:我正在使用 linux 和 g++。

【问题讨论】:

...哦,在一些可以通过阅读文档来避免的事情上扔掉很多多余的技术... ;) @Nim:我同意,但是会犯错误,在调试过程中发现它们比在生产中崩溃时说“他应该阅读文档”更可取。 @JaredC,出于同样的原因发明了单元测试...... ;) 我完全不喜欢在测试和生产中运行“特殊代码”的想法...... @Tometzky:这太疯狂了。当需要erase() 时,使用vector 有完全正当的理由。 @Nim:不,单元测试是为了测试你的一小段代码而发明的。它们不一定能帮助您检测您是否使用了无效的迭代器,部分原因是它可能经常似乎工作,尤其是在单元测试等简单的上下文中。调试时没有理由不启用额外的错误检查。 【参考方案1】:

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

编辑 jalf 的贡献:

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

***.com/questions/2567997/ 和

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

【讨论】:

GCC的标准库支持类似的调试模式:***.com/questions/2567997/…和gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html @JaredC:啊,抱歉。不确定 GCC。 @jalf:感谢您提供的链接,这正是我所需要的。我知道必须有一个实现。【参考方案2】:

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

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

【讨论】:

当前行为不是未定义,不是总是运行时错误吗? @JaredC:是的,标准规定的行为只是“未定义”(或者更准确地说,标准没有规定任何行为)。不需要运行时错误。

以上是关于C++向量调试实现的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 的 C++ 调试 - 向量大小变化的观察点

c++错误:调试断言失败

调试断言失败,向量下标超出范围

用 VS 调试 C++。追踪变量变化

每个循环的 c++ 向量不会遍历引用?

如何修复 C++ 中的“分段错误”错误