C++ new int[0] - будет ли он выделять память?



простое тестовое приложение:



cout << new int[0] << endl;


выходы:



0x876c0b8


Так что, похоже, это работает. Что говорит об этом стандарт? Всегда ли законно "выделять" пустой блок памяти?

1081   5  

5 ответов:

от 5.3.4/7

когда значение выражения в direct-new-declarator равно нулю, функция выделения вызывается для выделения массива без элементов.

от 3.7.3.1/2

эффект разыменования указателя, возвращаемого в качестве запроса на нулевой размер, не определен.

и

даже если размер запрашиваемого пространства [по new] равен нулю, запрос может неудача.

Это означает, что вы можете это сделать, но вы не можете юридически (четко определенным образом на всех платформах) разыменовать память, которую вы получаете - вы можете только передать ее в array delete - и вы должны удалить ее.

вот интересная сноска (т. е. не нормативная часть стандарта, но включенная для пояснительных целей), прилагаемая к предложению из 3.7.3.1/2

[32. Цель состоит в том, чтобы оператор new() был реализован путем вызова malloc () или calloc (), поэтому правила по существу одинаковы. C++ отличается от C тем, что требует нулевого запроса для возврата ненулевого указателя.]

Да, это законно выделять массив нулевого размера, как это. Но вы также должны удалить его.

что говорит об этом стандарт? Всегда ли законно "выделять" пустой блок памяти?

каждый объект имеет уникальный идентификатор, т. е. уникальный адрес, который подразумевает ненулевую длину (фактический объем памяти будет молча увеличен, если вы попросите нулевые байты).

Если вы выделили более одного из этих объектов, то это они имеют разные адреса.

Да это совершенно законно выделять 0 размер блока с new. Вы просто не можете сделать ничего полезного с ним, так как нет достоверных данных для доступа. int[0] = 5; является незаконным.

однако я считаю, что стандарт допускает такие вещи, как malloc(0) вернуться NULL.

вам нужно delete [] любой указатель, который вы получите обратно из распределения, а также.

Любопытно, что C++ требует, чтобы оператор new возвращал законный указатель даже когда запрашиваются нулевые байты. (Требуя этого странного звучания поведение упрощает вещи в других частях языка.)

нашел Эффективное C++ Третье Издание сказано так в "пункте 51: соблюдать Конвенцию при написании новых и исключении".

Comments

    Ничего не найдено.