aslan wrote:
"Ulrich Eckhardt" <eckhardt@satorlaser.com>, iletisinde ??unu yazd??,
news:nfufu6-lht.ln1@satorlaser.homedns.org...
aslan wrote:
The following code compiles (and runs) OK with VC++ 6.
std::vector<bool> smallsieve;
smallsieve.reserve(smsize+1);
memset(smallsieve.begin(), true, smsize+1);
Well, the code is broken in several ways:
1. An iterator is not a pointer.
OK. Maybe it's my habit from VC++6. because it works with it (at least
for
std::vector<T>::begin()).
2. reserve() doesn't change the number of elements in a vector, you
mean
resize().
No it's reserve(). Again it's OK with VC++6. Yeah right, it's bad. I
need
to change it.
Danger: reserve() allocates enough memory to store the given number of
elements, so you can add elements without the vector having to reallocate
memory. This does not change the size and it does not technically create
those elements or allow you to access them. Try this with VC6:
std::vector<bool> vec;
vec.reserve(2);
memset(smallsieve.begin(), true, 2);
bvec.push_back(false);
for(int i=0; i!=3; ++i)
std::cout << "vec[" << i << "]=" << vec[i] << std::endl;
You could also write a test class that gives you a message whenever it is
created, copied, assigned and destroyed and put that into a vector. You
could then actually see the difference between resize() and reserve().
Accessing them is what is called "undefined behaviour", which is
standardese
for "you should have checked that yourself and all guarantees are off".
You
are accessing these nonexistent elements using memset(). Since you are
probably never actually changing the size afterwards and the vector on
its
own doesn't touch that memory, you never even notice.
This is almost what I did after the suggestions. But without memset