自定义迭代器超出范围

时间:2016-06-17 15:59:28

标签: c++ iterator indexoutofboundsexception

我有一个迭代器类。我们在这里称它为PIterator。迭代正在输出MessageBuffer,除非迭代器当前指向的nSizeOfMessage加上等于整个消息的大小(位置正确,索引太大)。

如果我检查最后一个元素并减1,它应该可以工作。虽然这对我来说似乎是一种“错误的方式”。是的,我对此不太确定,所以我的问题显示在这个代码片段中,也许有人知道一个很好的解决方案,试图找出它已经有一段时间了。

是的,我确实知道如何使用调试器,我知道问题出在哪里,并且解释得很好。我不知道如何解决这个问题,除非按照我提到的方式使用。

这在Visual Studio 2015下编译得很好。

另请参阅主要功能中的注释。

#include <iostream>
#include <vector>

class MessageBuffer
{
public:
    MessageBuffer(const std::string &s)
    {
        _msgBuffer.assign(s.begin(), s.end());
    }

    char &operator[](std::size_t nIndex)
    {
        return _msgBuffer[nIndex];
    }

    //more functions...

private:
    std::vector<char> _msgBuffer;
};

class PIterator
{
public:
    PIterator(MessageBuffer &b)
        : m_Ref(b)
        , m_Where(0)
    { }

    PIterator &operator=(PIterator &other)
    {
        if (this == &other)
            return *this;
        this->m_Ref = other.m_Ref;
        this->m_Where = other.m_Where;
        return *this;
    }

    //more functions...

    PIterator operator+(unsigned int nValue) const
    {
        PIterator copy(*this);
        copy.m_Where += nValue;
        return copy;
    }

    PIterator &operator+=(unsigned int nValue)
    {
        m_Where += nValue;
        return *this;
    }

    char &operator*()
    {
        return m_Ref[m_Where];
    }

private:
    MessageBuffer &m_Ref;
    std::size_t m_Where;
};

int wmain(int argv, wchar_t **args)
{
    std::string msg = "123MyMessage"; //Length 12
                                    //                    ^ Index 3, Position 4

    MessageBuffer mb(msg);

    PIterator itr(mb);

    //Calculations - here the results hardcoded
    std::size_t nSizeOfMessage = 9; //The size of the message without the numbers

                                    //itr.m_Where is 3 - That's where the non-numeric part of the message starts
    itr += 3;

    std::string needThis;

    PIterator cpy = itr + nSizeOfMessage; //itr points to the first element of the message
                                        //cpy is now out of bounds - position is correct, but index is 1 too large

    needThis.assign(&*itr, &*cpy); //boom

    return 0;
}

2 个答案:

答案 0 :(得分:0)

而不是

needThis.assign(&*itr, &*cpy);

你需要使用

needThis.assign(itr, cpy);

如果您的 PIterator 满足迭代器要求,这将有效。

你调用赋值的方式,你传递指针而不是迭代器,它本身是有效的。但是,要获得指针,首先取消引用迭代器。取消引用过去的迭代器是未定义的行为,它在编译器的Debug配置中被捕获。

答案 1 :(得分:0)

我提出的解决方案非常简单 我没有使用临时迭代器,而是使用char指针并根据消息的大小递增它的地址,从而始终接收正确的最后一个元素。 应该早点见过。

needThis.assign(&*itr, (&*itr) + nSizeOfMessage);