Pointers into elements in a container
Posted
by Pillsy
on Stack Overflow
See other posts from Stack Overflow
or by Pillsy
Published on 2010-04-02T13:27:25Z
Indexed on
2010/04/02
13:33 UTC
Read the original article
Hit count: 180
Say I have an object:
struct Foo
{
int bar_;
Foo(int bar) bar_(bar) {}
};
and I have an STL container that contains Foo
s, perhaps a vector, and I take
// Elsewhere...
vector<Foo> vec;
vec.push_back(Foo(4));
int *p = &(vec[0].bar_)
This is a terrible idea, right?
The reason is that vector
is going to be storing its elements in a dynamically allocated array somewhere, and eventually, if you add enough elements, it will have to allocate another array, copy over all the elements of the original array, and delete the old array. After that happens, p
points to garbage. This is why many operations on a vector
will invalidate iterators.
It seems like it would be reasonable to assume that an operation that would invalidate iterators from a container will also invalidate pointers to data members of container elements, and that if an operation doesn't invalidate iterators, those pointers will still be safe. However, many reasonable assumptions are false. Is this one of them?
© Stack Overflow or respective owner