错误试图实现STL迭代器

Error trying to implement STL iterators

本文关键字:STL 迭代器 实现 错误      更新时间:2023-10-16

我是STL和迭代器的新手。我已经经常使用它们,但直到现在才了解它们的真正工作方式。对于作业,我的任务是重新编写一些Stl迭代器,以了解引擎盖下的情况。我在insert_iterator中途:

template <class Container>
class m_insert_iterator : public std::iterator<output_iterator_tag, void, 
void, void, void>
{
protected:
    Container* container;
    typename Container::iterator it;
public:
    typedef Container container_type;
    // Constructor:
    m_insert_iterator(Container &x, typename Container::iterator i)
    {
        *container = x;
        it = i;
    }
    // Assignment operator:
    m_insert_iterator<Container> &operator=(const typename Container::value_type &value)
    {
        it = container->insert(this, value);
        ++it;
        return *this;
    }
    // No-ops:
    m_insert_iterator<Container> &operator*() { return *this };
    m_insert_iterator<Container> &operator++() { return *this };
    m_insert_iterator<Container> &operator++(int) { return *this };
};
int main()
{
    vector<int> v{ 2, 3, 4 };
    m_insert_iterator<vector<int>> ins_it(v, v.begin());
    ins_it = 1;
    for (int i = 0; i < v.size(); i++)
    {
         cout << v[i] << " ";
    }
    system("pause");
}

每当我调用构造函数时,我的程序都会在*container = x上崩溃。在调试器中,我会收到一条错误消息,读取" 0xc0000005:访问违规读取位置0x00000000"。为什么会发生?

您的错误在于您对指针的理解,您无法将任何内容分配给非初始化的指针。因此,您无法在构造函数中分配对非初始化指针的引用:

*container = x;  // container is uninitialized, so this function will generate an AccessViolation

相反,您应该将其用作

container = std::addressof(x);

在这种情况下,您可以用传递给您的参考的地址初始化指针,但是在您的情况下,您正在尝试将参考复制到地址,以解决您的指针指向它,并且由于您的指针未初始化,因此您是试图写入内存的未知位置。

在最好的情况下,您会得到一个访问的人或类似的东西,但是如果碰巧写入对您的程序的记忆,也可能会造成奇怪的错误。例如,您可以覆盖一个或多个变量的值