Re: Am I misusing std::vector?
"loose AT astron DOT nl" <loose@astron.nl> wrote in message
news:1147252936.701110.275280@j73g2000cwa.googlegroups.com...
Hi,
I was surprised by the output of the program below. From what I
understand from the C++ STL documentation, vector<T>::resize(N), will
create N *newly constructed* objects of T. So, I expected *v[0].ip to
be equal to 0, and *v[sz-1].ip equal to -77. However, I discovered,
using a few different compilers (two different versions of gcc, and
icc), that both return -77. It turns out that only *one* object is
being constructed and this one object seems to be bitwise copied to the
other members. See my code below and try it for yourself.
Am I missing something here?
Regards,
Marcel Loose.
<code>
#include <vector>
#include <iostream>
using namespace std;
struct A
{
A(int i = 0) { ip = new int(i); }
~A() { delete ip; }
int* ip;
};
int main()
{
const unsigned sz = 1000000;
vector<A> v;
v.resize(sz);
*v[sz-1].ip = -77;
cout << "v.size() = " << v.size() << endl;
cout << "v[0].ip = " << v[0].ip << "; " << "*v[0].ip = " <<
*v[0].ip << endl;
cout << "v[sz-1].ip = " << v[sz-1].ip << "; " << "*v[sz-1].ip = "
<< *v[sz-1].ip << endl;
return 0;
}
</code>
The problem is with your A struct that does not have user-defined copy
constructor implementing deep copy semantics.
'resize' member function has the following declaration:
void resize(size_type sz, T c = T())
The new vector elements are created as copies of the second (default)
argument. In your case this means that they all get the same value of the ip
pointer member.
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]