"Kai-Uwe Bux" <jkherciueh@gmx.net> wrote in message
news:hqd0h7$tos$1@news.doubleSlash.org...
Leigh Johnston wrote:
"Alf P. Steinbach" <alfps@start.no> wrote in message
news:hqcu3t$7lo$1@news.eternal-september.org...
<snip>
Unless I am mistaken you are basically advocating that the following
code
is correct according to the standard:
void foo()
{
std::vector<int> v;
v.reserve(2);
v.push_back(41);
*(&v[0]+1) = 42;
}
The above code is plain wrong.
Please define your terms: what do you take "correct" to mean, and what is
"plain wrong"? Does the code have UB according to the standard?
If I you disagree then your position is
untenable. Anyone with an once of common sense would use std::vector in
the ways it was designed for and not abuse it like you are suggesting.
Keep the context in mind: Alf was pondering this option in the context of
the OP's request: If the alternative is to use malloc(), free(), and
realloc() manually, why not use the above? Or, why not do something
like the
above inside the implementation of a little wrapper that, to the outside,
looks like the wrapper for malloc(), free(), and realloc() that the OP
was
looking for?
Best
Kai-Uwe Bux
It is wrong in the sense that it is bad practice irrespective of whether
it is UB or not. std::vector is a container, it is not a general
purpose memory allocator. The correct solution is to write a class
designed for the specific requirements the OP had and I am glad to say
that the OP had sufficient common sense to realize this straight away,
common sense that Alf seems to lack.
Leigh, let me remind you that the suggestion of using a std::vector was *yours*,
...
loop.
I have only corrected your misguided belief (or perhaps after the fact creative
rationalization) about what's well-defined and undefined behavior in this.
So your criterion for lack of common sense, one who advocates using std::vector
statements quoted above.