在铿锵声中,有没有办法启用边界检查 [] 访问 std::vectors 和其他 STL 容器,最好是仅在调试模式下构建?
我只是花了几个小时寻找一个微妙的错误,结果证明它是由我们访问超过 std::vector 的末尾引起的。当它检测到错误时,它不需要做任何聪明的事情,只需在调试器中捕获,这样我就可以找出它发生的位置并在代码中修复它。
除了“创建自己的继承自 std::vector 的类型”之外,还有其他方法吗?我想避免这种情况?
(如果有什么不同,我正在使用 clang 3.1 版。)
libstdc++具有成熟的调试模式,使用-D_GLIBCXX_DEBUG.
libc++也有一个调试模式,-D_LIBCPP_DEBUG但我们可以看到这个邮件列表讨论:libc++调试模式的状态它是不完整的:
| 我的理解是,这项工作从未完成,它可能已损坏/不完整。
那是对的。它在我要修复/实施的事情清单上,但这不是我很快就会做到的事情。
它似乎确实适用于std::vectoron 3.4and up see it live,请给出以下程序:
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v = {0,1,2,3} ;
std::cout << v[-1] << std::endl ;
}
它会产生以下错误:
向量[] 索引超出范围
中止
如果您使用的是 Linux 或 OS X,您应该查看地址清理程序:
http://clang.llvm.org/docs/AddressSanitizer.html
它引入了 2 倍的减速,但会进行大量内存检查,并且可能会发现您的错误。
另一个救了我无数次的神奇工具是 valgrind。如果您可以使用 valgrind 运行,它将捕获大量内存错误和泄漏。
#define _GLIBCXX_DEBUG
这启用了各种内联检查(请参阅向量和调试/向量)