【发布时间】:2013-06-21 14:19:50
【问题描述】:
当我在std::vector 上使用clear() 时,它应该会破坏vector 中的所有元素,但实际上并没有。
示例代码:
vector<double> temp1(4);
cout << temp1.size() << std::endl;
temp1.clear();
cout << temp1.size() << std::endl;
temp1[2] = 343.5; // I should get segmentation fault here ....
cout << "Printing..... " << temp1[2] << endl;
cout << temp1.size() << std::endl;
现在,我应该在尝试访问已清除的向量时遇到分段错误,但它会填充那里的值(在我看来这是非常错误的)
结果如下:
4
0
Printing..... 343.5
0
这正常吗?这是一个很难发现的错误,它基本上杀死了我几个月的代码。
【问题讨论】:
-
如果你想捕捉类似的bug,使用checked容器(gcc可以做到这一点,或者外部stl库等)
-
内存管理单元产生分段错误,这是一个 C++ 不需要的硬件组件。如果未能获得段错误导致您的程序行为不端,那么您将遇到更严重的问题。
-
您可以使用
at运算符进行边界检查并给出异常。我建议使用at而不是[] -
@KarolyHorvath:默认情况下,MSVC 的库在调试版本中被选中,而在发布版本中未选中。太棒了。
-
您可以考虑尝试使用 clang 静态分析器分析您的代码:clang-analyzer.llvm.org。我认为它会标记这个错误。
标签: c++ stdvector undefined-behavior