C++ 发布模式下迭代器的绑定检查(c+;+;)

C++ 发布模式下迭代器的绑定检查(c+;+;),c++,vector,iterator,C++,Vector,Iterator,我故意让迭代器超过std::vector的大小 for (std::vector <Face>::iterator f = face.begin(); f!=face.end()+5; ++f) { // here I try to access (*f).P // note that I added 5 to the face.end() } for(std::vector::iterator f=face.beg

我故意让迭代器超过
std::vector
的大小

for (std::vector <Face>::iterator f = face.begin();
          f!=face.end()+5;
               ++f)
{
    // here I try to access (*f).P
    // note that I added 5 to the face.end()
}
for(std::vector::iterator f=face.begin();
f!=端面端部()+5;
++(f)
{
//在这里,我尝试访问(*f).P
//注意,我在face.end()中添加了5
}

在编译和运行时期间,我也没有遇到任何错误。如何防止这种情况发生?

如果您想要检查对
向量
元素的访问,您可以使用
at
函数,该函数在边界冲突的情况下抛出
std::out_of_range
异常。例如:

for (std::vector<Face>::size_type i = 0;
          i != face.size()+5;
               ++i)
{
    face.at(i).f();
}
for(std::vector::size_type i=0;
i!=面部大小()+5;
++(一)
{
面.at(i.f();
}

该标准没有指定任何选中的迭代器。标准中的措辞是,访问无效迭代器会导致未定义的行为。但是许多实现提供了检查迭代器。如果不考虑可移植性,您可以使用其中一个检查迭代器。例如,在MSVC调试模式下,
vector::iterator
是一个选中的迭代器。但是,在发布模式下,它只是一个TyBuffs,用于<代码> T*<代码>

< P>你使用的C++编译器是什么? VC10(即VS2010中的C++编译器)在调试构建中正确地识别出问题:

// Compile with:
// cl /EHsc /W4 /nologo /D_DEBUG /MDd test.cpp


#include <iostream>
#include <string>
#include <vector>


class Face
{
public:
    std::string Name;

    explicit Face(const std::string & name)
      : Name(name)
    {}
};


int main()
{
    std::vector<Face> faces;
    faces.push_back( Face("Connie") );
    faces.push_back( Face("John") );

    for (
        std::vector <Face>::iterator f = faces.begin();
        f != faces.end() + 5;
        ++f)
    {
        std::cout << f->Name << std::endl;
    }

    return 0;
}
//编译时使用:
//cl/EHsc/W4/nologo/D_DEBUG/MDd test.cpp
#包括
#包括
#包括
阶级面孔
{
公众:
std::字符串名;
显式面(const std::string和name)
:姓名(姓名)
{}
};
int main()
{
向量面;
脸。推回(脸(“康妮”);
脸。推回(脸(“约翰”);
为了(
std::vector::迭代器f=faces.begin();
f!=面.end()+5;
++(f)
{

STD::对于C++标准库的发布版本,CUT名称

,您将无法在迭代器(或其他可能未被检查的操作)中进行边界检查。因为它会比较慢。但是,这并不意味着您需要在调试模式下编译:据我所知,libstdc++调试模式可以在启用编译器优化的情况下使用。我怀疑这对于其他已检查的STL实现是正确的,因为已检查的代码通常由se引导适当地设置一些宏。要做到这一点,你需要找到适当的宏设置,并用你用来构建代码的任何东西适当地设置它们。

不要这样做吗?至于检测,请搜索选中的迭代器。调试构建通常会捕捉到我使用Release是因为需要运行时性能。@Shibli:你需要使用这两种配置。其中一种配置称为“调试”,另一种配置称为“发布”。在准备发布之前,您不想放弃额外的调试测试。我以前没有想过。它在调试时出现了一个运行时错误。谢谢。在调试模式下,它可以在不使用
at
的情况下发现错误。因为我不理解您的最后一句话,所以在发布模式下,我应该使用
at
进行检查吗?@Shibli:检查是正确的如果你想抛出一个异常,那么你应该使用它。如果你知道你所有的边界是正确的,不希望额外检查开销,那么不要使用AT。@ Shibli:欢迎。用VisualC++ Visual C++实现的STL实现其检查的迭代器和调试迭代器是非常好的调试目的。支持。