2016-03-15 3 views
7

This question спрашивает, что это динамический тип объекта, выделенного malloc и в соответствии с верхней ответ:В какой момент память, выделенная malloc, получает тип?

Возвращаемое значение malloc является блок неинициализированного хранения. В этом хранилище не было создано никакого объекта. И поэтому он не имеет динамического типа.

Это еще один вопрос: в какой момент имеет смысл сказать, что хранилище, возвращаемое malloc, получает тип. Например:

void *p = malloc(sizeof(int)); 
int *pi = (int*)p; 

мы можем сказать, что pi выше указывает на объект динамического типа int, несмотря на то, что он инициализирован?

+0

У меня нет ссылки на руку, но в качестве недержания, когда вы пишете «int». Ссылка есть где-то в материалах о жизни объектов (в частности, типов POD), если кто-то хочет сделать работу и претендовать на славу. –

+0

@SteveJessop Материал о жизни объекта не говорит об этом (в C++ 14). –

+0

@ M.M: О, изменили ли они это? –

ответ

7

Статус-кво в соответствии со стандартом заключается в том, что там нет объекта.

[intro.object]/1:

Объект создается с помощью определения ([basic.def]), с помощью новой экспрессии ([expr.new]) или путем осуществления ([class.temporary]) при необходимости.

Смотрите также обсуждение в P0137, что сделало бы вышеприведенную цитату определение объекта:

Редакционного примечание: это сохраняет статус-кво, что только malloc является недостаточно для создания объект.

(int *)p нет.

+0

Удивительный, спасибо! – vitaut

+0

Так что, если вы делаете '* p = 0;', is * that *, то объект? Или являются 'int' с статическими, автоматическими или объектами продолжительности хранения потоков, потому что они создаются с помощью определений, в то время как 'int' с динамической продолжительностью хранения не являются объектами, если вы не используете новое выражение, и ни одна из вещей, говорит о том, какие объекты применимы к ним? –

+1

@SteveJessop '* p = 0' не создает объект, а' new (p) int() 'создает его. –

2

Ответ: когда объект создается в хранилище, которое выделяет malloc().

Примечание: malloc() определен в стандарте C и указан в стандарте C++. Взаимодействие со стандартом C++ предназначено для совместимости, а не как первичный источник.

Какой malloc() возвращает указатель на уникальную область хранения (или NULL). Он не выделяет и не возвращает объект. Объект может быть создан в этом хранилище различными способами, и это объект, который имеет тип, а не хранилище.

Образец кода, заданный в вопросе, создает типизированный указатель, но не влияет на хранилище.

Смежные вопросы