Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Strange bug with iterators

18 views
Skip to first unread message

Juha Nieminen

unread,
May 18, 2012, 2:10:56 PM5/18/12
to
I have this piece of (C++11) code:

//----------------------------------------------------------------------
#include <iterator>

template<typename Iter_t>
struct RangeWrapper
{
Iter_t mBegin, mEnd;
RangeWrapper(Iter_t b, Iter_t e): mBegin(b), mEnd(e) {}
Iter_t begin() { return mBegin; }
Iter_t end() { return mEnd; }
};

template<typename Container_t>
RangeWrapper<typename Container_t::reverse_iterator>
revRange(Container_t container)
{
return { container.rbegin(), container.rend() };
}


#include <vector>
#include <iostream>

int main()
{
std::vector<int> v = { 1, 3, 5, 7, 9 };

for(int i: revRange(v)) std::cout << " " << i;
std::cout << "\n";
}
//----------------------------------------------------------------------

For some reason it does not work properly when compiled with gcc 4.6.3.
It prints the first numbers ok, but then it starts printing zeros.

If I compile with -D_GLIBCXX_DEBUG I get a strange runtime error:

/usr/include/c++/4.6/debug/safe_iterator.h:142:error: attempt to copy-
construct an iterator from a singular iterator.

I don't understand what that means.

When run with gdb, the backtrace indicates that the error seems to
happen in RangeWrapper::begin().

Juha Nieminen

unread,
May 18, 2012, 2:15:15 PM5/18/12
to
Juha Nieminen <nos...@thanks.invalid> wrote:
> revRange(Container_t container)

Ah, the bug was here. My bad.

jacob navia

unread,
May 19, 2012, 6:56:04 PM5/19/12
to
Le 18/05/12 20:15, Juha Nieminen a écrit :
> Juha Nieminen<nos...@thanks.invalid> wrote:
>> revRange(Container_t container)
>
> Ah, the bug was here. My bad.
????
Can you explain what was the bug, why it was there and how you fixed it?

Anand Hariharan

unread,
May 19, 2012, 10:43:25 PM5/19/12
to
It should have been -

revRange(Container_t & container)

^^^

Since a the container was passed by value, the iterators that were
returned were that of the generated copy, not the intended container.
0 new messages