[Bug][VC] Cнова?
От: _nn_  
Дата: 30.05.10 11:48
Оценка: 35 (2) -1 :))) :))) :))) :)
Простой код

struct base
{
  int i;
  char c;
};

struct derived : base
{
  double d;
};

#include <stdio.h>

int main()
{  
 base b = base();
 printf("b.i - %d\n", b.i);
 printf("b.c - %d\n", (int)b.c);

 derived d = derived();
 printf("d.i - %d\n", d.i);
 printf("d.c - %d\n", (int)d.c);
 printf("d.d - %f\n", d.d);
}


G++ 4.4.3

b.i — 0
b.c — 0
d.i — 0
d.c — 0
d.d — 0.00000


VC 2008, 2010

b.i — 0
b.c — 0
d.i — -858993460
d.c — -52
d.d — -925596....


Если не наследоваться, то работает нормально:
struct derived /* : base*/
{
  base b;
  double d;
};


А также работает через new
derived* pd = new derived();
derived& d = *pd;

...


К счастью нашлось более элегантное решение через placement new:
derived d;
new (&d) derived();


Тут можно возразить, и посоветовать memset.
Однако memset не будет хорошо работать для классов с нетривиальными конструкторами.

Если добавить класс с нетривиальным конструктором, VC конкретно лажает:
struct nontrivial
{
  nontrivial() : member(4) {}
  ~nontrivial() {}

  int member;
};

struct base
{
  int i;
  char c;

  nontrivial n;
};

struct derived : base
{
  double d;
};

#include <stdio.h>
#include <new>

int main()
{  
 base b = base();
 printf("b.i - %d\n", b.i);
 printf("b.c - %d\n", (int)b.c);
 printf("b.n.member - %d\n", b.n.member);

 derived d = derived();
 new (&d) derived(); // Workaround ??
 printf("d.i - %d\n", d.i);
 printf("d.c - %d\n", (int)d.c);
 printf("d.d - %f\n", d.d);
}


Вывод

b.i — -858993460
b.c — -52
b.n.member — 4
d.i — -858993460
d.c — -52
d.d — -925596....


Тут уже ничего не помогает. Даже new base() не работает.

В общем какой-то баг с инициализацией.
Берегитесь
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.