Re: Wrong
* Joshua Maurice:
On Apr 17, 8:36 pm, "Alf P. Steinbach" <al...@start.no> wrote:
* Joshua Maurice:
On Apr 17, 12:49 pm, "Leigh Johnston" <le...@i42.co.uk> wrote:
A certain regular of this newsgroup thinks the following code is not wrong,
discuss.
void foo()
{
std::vector<int> v;
v.reserve(2);
v.push_back(41);
*(&v[0]+1) = 42;
}
The actual definition of "wrong" may vary from individual to individual as
does common sense so it seems.
This may help:
If by wrong, you mean undefined behavior, then yes. The push_back is
fine, but the next line writes to an area which has been reserved but
not in the size. I know of several debug implementations of the
standard library which will crash horribly and report the error of the
code.
Example?
My mistake. I am incorrect. I thought visual studios debug iterators
would catch it. However, the undefined behavior line in question was
not using iterators but raw pointers.
Yes. I don't think it's undefined behavior (as I see it it's guaranteed and
well-defined, because the standard guarantees that there is a raw array of size
2 or larger, and, since it can't be put in place after the reserve call, that
that array is the buffer accessible via &v[0], and the standard also guarantees
pointer access of raw arrays). I think it's just bad practice, although like
"goto" there may be circumstances where it's The Lesser Evil(TM).
I was thinking of the following
example, which visual studios debug iterators do catch.
#include <vector>
using namespace std;
int main()
{
std::vector<int> v;
v.reserve(2);
v.push_back(41);
*(v.begin()+1) = 42;
}
Yes. :-)
For other readers: here the +1 advances the iterator to end(), instead of being
raw pointer arithmetic advancing a raw pointer.
Cheers,
- Alf