Вопрос по c++, new-operator – C ++ new int [0] - будет ли он выделять память?

215

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

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

выходы:

0x876c0b8

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

Error: User Rate Limit Exceeded Zifre
@Zifre: я прошу любопытства, но это может иметь значение в реальном мире, например. когда размер выделенных блоков памяти вычисляется каким-либо образом, и результат вычисления может быть нулевым, то нет прямой необходимости добавлять исключения, чтобы не распределять блоки нулевого размера. Потому что они должны быть распределены и удалены без ошибок (если только блок нулевого размера не разыменовывается). Таким образом, обычно это дает более широкую абстракцию того, что представляет собой блок памяти. anon
Error: User Rate Limit Exceeded Trevor Robinson
Error: User Rate Limit Exceeded Drew Dormann
Error: User Rate Limit Exceeded Evan Teran

Ваш Ответ

5   ответов
15

allocate" empty block of memory?

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceedednew[]Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededwhile(!exitRequested) { char *p = new char[0]; delete [] p; }Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededoperator []Error: User Rate Limit Exceededisocpp.org/wiki/faq/freestore-mgmt#num-elems-in-new-arrayError: User Rate Limit Exceeded
Error: User Rate Limit Exceededopen-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdfError: User Rate Limit Exceededoperator new[]Error: User Rate Limit Exceedednew expressionError: User Rate Limit ExceedednewError: User Rate Limit ExceededrequiredError: User Rate Limit Exceeded
14

0newint[0] = 5;

malloc(0)NULL.

Вам все еще нужно будетdelete []

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
221

When the value of the expression in a direct-new-declarator is zero, the allocation function is called to allocate an array with no elements.

От 3.7.3.1/2

The effect of dereferencing a pointer returned as a request for zero size is undefined.

Также

Even if the size of the space requested [by new] is zero, the request can fail.

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

[32. The intent is to have operator new() implementable by calling malloc() or calloc(), so the rules are substantially the same. C++ differs from C in requiring a zero request to return a non-null pointer.]

Error: User Rate Limit Exceedednew[]Error: User Rate Limit Exceededdelete[]Error: User Rate Limit Exceedednew[i]Error: User Rate Limit Exceededdelete[]Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
20

Error: User Rate Limit Exceededint ar[0];Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsizeof (type)Error: User Rate Limit Exceededstackoverflow.com/questions/2632021/can-sizeof-return-0-zero
Error: User Rate Limit Exceeded
1

even when zero bytes are requested. (Requiring this odd-sounding behavior simplifies things elsewhere in the language.)

Error: User Rate Limit ExceededEffective C++ Third EditionError: User Rate Limit Exceeded

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