Jaa


C++ small gotcha - 3

Have two class as below:

 

struct MyBase

{

  __int64 x;

  __int64 y;

  MyBase()

  {

          memset(this, 0, sizeof(MyBase));

  }

};

 

struct MyDerived: public MyBase

{

  int z;

  MyDerived():MyBase(), z(0)

  {}

};

 

Then create two objects as below, and then compare these two
objects with memcmp, do you think the c compare will be equal since the
constructor has initialized all the members of the objects to be 0?

 MyDerived obj1;
 MyDerived obj2;
  
 if (memcmp(&obj1, &obj2, sizeof(MyDerived)) == 0)
 {
         cout << "equal" << endl;
 }

 

The answer is no. Since due to data alignment, the size of
MyDerived is 24 bytes, although the constructor has initialized x, y and z to
0, there are still 4 bytes keeps uninitialized, so they may be equal or not.

Comments

  • Anonymous
    April 15, 2012
    Interesting issue. Thanks for posting!