оператор new возвращает указатель на 0 байт

225
04 декабря 2017, 17:32

Для чего может понадобиться такая конструкция и почему при запросе 0 байт возвращается указатель.

char* pC = new char[0];

куда указывает указатель в данном примере?

Answer 1

Представьте себе, что вы пишете собственный класс-контейнер наподобие vector<T>. Реальные данные у вас будут храниться в массиве. Для размера данных N вам нужно capacity (размер массива) не менее N. Если не разрешить массивы нулевого размера, то вам придётся в вашем коде кодировать случай пустого, только сконструированного контейнера отдельно.

Другой пример, пускай в вашем коде нужен массив из N пользователей, где N приходит от пользователя. Запрещать 0 пользователей, и кодировать этот случай по-другому было бы глупо и чревато ошибками.

Ну или вы разбираете HTML-документ, и возвращаете все найденные ссылки. Если их ноль, какого размера выделять под них массив?

Ноль — нормальный частный случай числа. Если бы стандарт сделал массивы длиной в ноль отдельным случаем, то и в нашем коде приходилось бы обрабатывать этот случай отдельно. Зачем? Пользы от этого никакой, а только возможный вред.

(Да, отрицательные числа — не нормальный случай. У нас может быть ноль пользователей, но не может быть −1 пользователь.)

Ваш код возвращает какой-то ненулевой указатель. Сколько именно байт реально аллоцируется — подробности имплементации стандартной библиотеки вашего компилятора. В любом случае вы не имеете права разыменовывать полученный указатель.

READ ALSO
Не срабатывает realloc с разыменованием указателя

Не срабатывает realloc с разыменованием указателя

Есть два класса - родитель (Capture) и потомок (Camera)В родителе реализована одна общая функция, которая вызывает функцию, переопределённую у потомков:

232
Определить какая кнопка зажата (стиль)

Определить какая кнопка зажата (стиль)

Есть, например, 200 кнопок (обычная и radiobutton)

253
Ключ шифрования в base64

Ключ шифрования в base64

Генерирую ключи RSA шифрованияKак правильно сделать из них base64 для хранения и передачи и как правильно вернуть из base64 key ? Если можно, приведите...

272