Я учусь для итогового экзамена, и я наткнулся на любопытный вопрос, который был частью экзамена, который наш учитель дал в прошлом году некоторым плохим душам. Вопрос проходит примерно так:
Следующая программа корректна, или нет? Если это, запишите что выводы программы. Если это не, запишите почему.
Программа:
#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)Нет, p2-> x может быть любым после вызова malloc. Просто в вашей тестовой среде это 0.
Все, что вам говорили, new объединяет вызов для получения памяти из бесплатного хранилища с вызовом конструктора объекта. Маллок делает только половину этого.
Исправление: Пока программа-пример неверна. Не всегда неправильно использовать malloc с классами. Это совершенно справедливо в ситуации с общей памятью, вам просто нужно добавить вызов на месте в new:
p2=(cls*)malloc(sizeof(cls));
new(p2) cls;
new вызывает конструктор, malloc - нет. Поэтому ваш объект будет находиться в неизвестном состоянии.
Реальное поведение неизвестно, потому что new
действует примерно так же, как malloc
+ constructor
вызов.
В вашем коде вторая часть отсутствует, следовательно, в одном случае это может работать, в другом нет, но точно сказать нельзя.
Почему 0 тоже не может быть произвольным числом? Вы работаете в режиме отладки? Какой компилятор?
VC ++ предварительно заполняет вновь выделенную память строкой байтовых значений 0xCC (конечно, в режиме отладки), поэтому вы не получили бы ноль для ответа, если бы использовали его.
Malloc не дает никаких гарантий обнулить выделенную им память, и результат программы не определен.
В противном случае есть много других вещей, которые мешают этой программе быть корректной на C ++. cout
находится в пространстве имен std
, malloc
необходимо включить через #include
и iostream.h также не соответствует стандарту .