Re: Type cast problem with VC++ 2005 Express Edition
- From: "aslan" <aslanski2002@xxxxxxxxx>
- Date: Wed, 2 Dec 2009 11:09:49 +0200
"Ulrich Eckhardt" <eckhardt@xxxxxxxxxxxxxx>, iletisinde şunu yazdı, news:d9jhu6-05v.ln1@xxxxxxxxxxxxxxxxxxxxxxxxx
aslan wrote:OK."Ulrich Eckhardt" <eckhardt@xxxxxxxxxxxxxx>, iletisinde şunu yazdı,
news:nfufu6-lht.ln1@xxxxxxxxxxxxxxxxxxxxxxxxx
aslan wrote:OK. Maybe it's my habit from VC++6. because it works with it (at least forThe 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.
std::vector<T>::begin()).
2. reserve() doesn't change the number of elements in a vector, you meanNo it's reserve(). Again it's OK with VC++6. Yeah right, it's bad. I need
resize().
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.
BTW: I mentioned that you can actually use memset():
std::vector<T> vec;
vec.resize(n);
std::memset(&vec.front(), 0, vec.size()*sizeof(T));
This is almost what I did after the suggestions. But without memset because you can also specify the value to set to resize(), so:
std::vector<bool> vec;
vec.resize(n, true);
This requires that 'T' is a POD, i.e. a type without any constructor,
virtual function etc. Builtin types, enumerations, unions and C-compatible
structures are such PODs.
Uli
--
C++ FAQ: http://parashift.com/c++-faq-lite
Sator Laser GmbH
Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932
.
- Follow-Ups:
- References:
- Type cast problem with VC++ 2005 Express Edition
- From: aslan
- Re: Type cast problem with VC++ 2005 Express Edition
- From: Ulrich Eckhardt
- Re: Type cast problem with VC++ 2005 Express Edition
- From: aslan
- Re: Type cast problem with VC++ 2005 Express Edition
- From: Ulrich Eckhardt
- Type cast problem with VC++ 2005 Express Edition
- Prev by Date: Re: Type cast problem with VC++ 2005 Express Edition
- Next by Date: Re: Type cast problem with VC++ 2005 Express Edition
- Previous by thread: Re: Type cast problem with VC++ 2005 Express Edition
- Next by thread: Re: Type cast problem with VC++ 2005 Express Edition
- Index(es):
Relevant Pages
|