Что, оказывается, классифицирует участников, когда malloc используется вместо нового?

Я учусь для итогового экзамена, и я наткнулся на любопытный вопрос, который был частью экзамена, который наш учитель дал в прошлом году некоторым плохим душам. Вопрос проходит примерно так:

Следующая программа корректна, или нет? Если это, запишите что выводы программы. Если это не, запишите почему.

Программа:

#include<iostream.h>
class cls
{     int x;
      public: cls() { x=23; }
      int get_x(){ return x; } };
int main()
{     cls *p1, *p2;
      p1=new cls;
      p2=(cls*)malloc(sizeof(cls));
      int x=p1->get_x()+p2->get_x();
      cout<<x;
      return 0;
}

Мой первый инстинкт должен был ответить "программой, не корректно, как new должен использоваться вместо malloc". Однако после компиляции программы и наблюдения, что это производит 23 Я понимаю, что тот ответ не мог бы быть корректным.

Проблема состоит в том, что я ожидал p2->get_x() возвратить некоторое произвольное число (что бы ни случилось, чтобы быть в том месте памяти когда malloc был назван). Однако это возвратилось 0. Я не уверен, является ли это совпадением или если участники класса инициализируются с 0, когда это malloc- редактор.

  • Это поведение (p2->x быть 0 после malloc) значение по умолчанию? Я должен был ожидать это?
  • Что было бы Ваш ответ на вопрос моего учителя быть? (помимо упущения к #include <stdlib.h> для malloc :P)
8
задан Bill the Lizard 4 February 2013 в 18:50
поделиться

5 ответов

  • Это поведение (p2-> x равно 0 после malloc) по умолчанию? Должен ли я этого ожидать?

Нет, p2-> x может быть любым после вызова malloc. Просто в вашей тестовой среде это 0.

  • Как бы вы ответили на вопрос моего учителя? (помимо того, что мы забыли включить #include для malloc: P)

Все, что вам говорили, new объединяет вызов для получения памяти из бесплатного хранилища с вызовом конструктора объекта. Маллок делает только половину этого.

Исправление: Пока программа-пример неверна. Не всегда неправильно использовать malloc с классами. Это совершенно справедливо в ситуации с общей памятью, вам просто нужно добавить вызов на месте в new:

p2=(cls*)malloc(sizeof(cls));
new(p2) cls;
14
ответ дан 5 December 2019 в 09:24
поделиться

new вызывает конструктор, malloc - нет. Поэтому ваш объект будет находиться в неизвестном состоянии.

3
ответ дан 5 December 2019 в 09:24
поделиться

Реальное поведение неизвестно, потому что new действует примерно так же, как malloc + constructor вызов.

В вашем коде вторая часть отсутствует, следовательно, в одном случае это может работать, в другом нет, но точно сказать нельзя.

1
ответ дан 5 December 2019 в 09:24
поделиться

Почему 0 тоже не может быть произвольным числом? Вы работаете в режиме отладки? Какой компилятор?

VC ++ предварительно заполняет вновь выделенную память строкой байтовых значений 0xCC (конечно, в режиме отладки), поэтому вы не получили бы ноль для ответа, если бы использовали его.

0
ответ дан 5 December 2019 в 09:24
поделиться

Malloc не дает никаких гарантий обнулить выделенную им память, и результат программы не определен.

В противном случае есть много других вещей, которые мешают этой программе быть корректной на C ++. cout находится в пространстве имен std , malloc необходимо включить через #include и iostream.h также не соответствует стандарту .

0
ответ дан 5 December 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: