在铛,有一种方法,以使边界建设仅调试模式时检查[]访问的std ::向量和其它STL容器,优选?
我只花了几个小时追捕一个微妙的错误,竟然是由美国访问过去一个std ::向量的末尾引起的。 它并不需要做任何事情聪明,当它检测到错误,只是陷阱在调试器,这样我可以找出它发生在代码修复它。
有没有办法做到这一点比其他“创建您自己的类型,从性病::向量继承”,我想避免?
(我使用铛3.1版,如果有差别。)
在铛,有一种方法,以使边界建设仅调试模式时检查[]访问的std ::向量和其它STL容器,优选?
我只花了几个小时追捕一个微妙的错误,竟然是由美国访问过去一个std ::向量的末尾引起的。 它并不需要做任何事情聪明,当它检测到错误,只是陷阱在调试器,这样我可以找出它发生在代码修复它。
有没有办法做到这一点比其他“创建您自己的类型,从性病::向量继承”,我想避免?
(我使用铛3.1版,如果有差别。)
如果你使用的是Linux或OS X,你应该看看地址消毒剂:
http://clang.llvm.org/docs/AddressSanitizer.html
它引入了一个2倍放缓,但确实一堆内存检查,并可以赶上你的错误。
另一个惊人的工具,它为我节省了无数次的valgrind是。 如果你可以用Valgrind的运行它会赶上一吨的内存错误和泄漏。
libstdc++
具有成熟的调试模式使用-D_GLIBCXX_DEBUG
。
libc++
也有一个调试模式使用-D_LIBCPP_DEBUG
,但我们可以看到这个邮件列表讨论:的libc ++调试模式的状态是不完整的:
| 我的理解是,这项工作一直没有完成,它可能打破/不完整的。
那是正确的。 这是我的东西来修复/实行名单上,但它不是东西,我会得到很快。
它似乎对工作std::vector
的3.4
和高达现场观看 ,给下面的程序:
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v = {0,1,2,3} ;
std::cout << v[-1] << std::endl ;
}
它生成以下错误:
矢量[]索引超出范围
中止
#define _GLIBCXX_DEBUG
这使得各种内嵌检查(见矢量和调试/矢量)