кастинг и макет объекта

Я пытался понять расположение объекта, приведя следующие два несвязанных класса:

class A
{
public:
A(int x):_a(x){}

private:
int _a;
};

class B
{
public:
void Show()
{
cout << "&_x = " << &_x << "," << " _x = " << _x << endl;
cout << "&_y = " << &_y << "," << " _y = " << _y << endl;
cout << "&_z = " << &_z << "," << " _z = " << _z << endl;
}

private:
int _x, _y, _z;
};

Для проверки классов основной имеет следующий код:

int main()
{
A * pA = new A(5);
cout << pA << endl;
B * pB = (B *) pA;
pB->Show();
}

Согласно тому, что я понимаю,

  • Звонок будет успешным
  • B :: _ x будет иметь значение A :: _ a
  • Во время выполнения попытка доступа к B :: _ y и B :: _ z в B :: Show () должна завершиться сбоем, так как объект изначально имел тип A и размер 4 байта, где компилятор ожидал, что _y и _z быть со смещением 4 и 8 байтов от начального адреса объекта B размером 12 байтов.

В действительности, хотя с VS2010, в режиме отладки операторы в B :: Show () печатаются, а _y и _z указывают на нежелательные значения,
в режиме выпуска операторы печатаются, а _y и _z указывают на нежелательные значения, а затем происходит сбой (только иногда :-().

Я ожидал, что мы должны были наблюдать сбой, как только мы попытаемся получить доступ к _y и _z, поскольку они должны указывать на нераспределенную память, но этого не происходит. Я знаю, что это тот случай, когда предполагается, что он относится к сфере «неопределенного поведения», но как все же можно объяснить такое поведение?

1

Решение

Поведение неопределенного поведения не определено. По определению.

Мы можем размышлять о Зачем программа терпит неудачу по-разному, но правда в том, что она может меняться изо дня в день, или работать, или строить для сборки.

0

Другие решения

Эта проблема не имеет никакого реального эффекта, забудьте об этом!

0

По вопросам рекламы [email protected]