Выделение памяти нулевым размером в C ++? - PullRequest
0 голосов
/ 10 января 2011
int a = 10;
int *p = new int[0];

p = &a;
cout << *p << endl;

В c ++, что произойдет, если выделить объем памяти на ноль?

после выделения я получаю правильный указатель памяти и печатает действительное число.

Но я думаю, что новый оператор должен возвращать что-то вроде FAILD или NULL.

Кто-нибудь может объяснить подробно?

Ответы [ 5 ]

3 голосов
/ 10 января 2011

после выделения я получаю правильный указатель памяти и печатает действительное число.

Ваш код на самом деле не проверяет это.

Когда вы делаете p = &a, вы переназначаете p , чтобы указать куда-то совершенно другое . Что бы там ни было, это не имеет отношения к продолжению выполнения программы.

1 голос
/ 10 января 2011

В c ++, что произойдет, если выделить объем памяти на ноль?

Допустим массив нулевого размера.
Вы просто можете отменить ссылку на любого участника.

Вот почему греки так долго обсуждали его, думая о нуле как о числе. Но мы можем поблагодарить Индию за ее великие умы за то, что они в конечном итоге привели ноль к числу 0. Это заняло их навсегда, и разве мы не рады, что многие современные математические вычисления были бы невозможны без такой уникальной ценности.

после выделения я получаю правильный указатель памяти,

Это правильно.
Если он потерпит неудачу, он выдаст исключение.

и печатает действительный номер.

Ваше задание: p = &a;, вероятно, не то, что вы хотите. Поскольку это только утечка памяти и установите p, чтобы указать на переменную a. Что вы, вероятно, пытались сделать, это:

(*p) = a;
// or
p[0] = a;

Это неопределенное поведение.
Как вы присваиваете значения после конца массива.

Но я думаю, что новый оператор должен возвращать что-то вроде FAILD или NULL.

номер

Кто-нибудь может объяснить подробнее?

Да.

1 голос
/ 10 января 2011

Из ИСО / МЭК 14882: 2003 (E), 5.3.4.7

Когда значение выражения в директиве прямого нового объявления равно нулю, функция выделения вызывается для выделениямассив без элементов.

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

1 голос
/ 10 января 2011

Из ИСО / МЭК 14882: 2003 (E), 5.3.4.6

Каждое выражение константы в непосредственном объявлении нового объявления должно быть целым выражением константы (5.19) и вычислятьстрого положительная ценность.Выражение в непосредственном объявлении-новой-декларации должно иметь целочисленный тип или тип перечисления (3.9.1) с неотрицательным значением.[Пример: если n - переменная типа int, то новый float [n] [5] правильно сформирован (потому что n является выражением direct-new-объявление), но новый float [5] [n]плохо сформирован (потому что n не является константным выражением).Если n отрицательно, эффект нового float [n] [5] не определен.]

Они интеллектуальны.Можно ли считать ноль non-negative value?Наверное, да, так как он компилируется без проблем, я думаю.

1 голос
/ 10 января 2011

Вы назначаете указатель «p» на чанке «a», так что p больше не указывает на чанк нулевого размера при его печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...