数组迭代器不是dereferencable错误

时间:2016-04-25 04:10:44

标签: c++ visual-c++ stdarray

有一个示例代码将错误发生为波纹管。 在发布模式下,它可以工作并打印五个 - '。 但是,在调试模式下,它不起作用,并且发生运行时错误,即“数组迭代器不可解除引用”。

环境细节: Windows 7 64位 Visual Studio 2015更新2

我不知道为什么在发布和调试模式之间存在差异。 提前谢谢。

#include <iostream>
#include <array>

static bool operator != (int * a, std::array<int, 5>::iterator &b)
{
    return a != &(*b);
}

int main(void)
{
    std::array<int, 5> arr = { 0,0,0,0,0 };

    for (auto* it = &arr[0]; it != arr.end(); it++)
    {
        std::cout << "-" << std::endl;
    }

    return 0;
}

2 个答案:

答案 0 :(得分:3)

*bb时,您致电arr.end()。这会导致undefined behaviour。您只能在引用数组元素的迭代器上使用*

答案 1 :(得分:-2)

重载运算符要求至少一个操作数是类或枚举类型。 std::array<int, 5>::iterator只是int*的typedef,是一种内置类型。您不需要重载比较运算符,因为指针之间的比较已经明确定义。

参考文献:

https://isocpp.org/wiki/faq/intrinsic-types#intrinsics-and-operator-overloading

https://gcc.gnu.org/onlinedocs/libstdc++/manual/iterators.html