-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80


оператор new выделение памяти больше 4Gb

Понедельник, 23 Ноября 2020 г. 20:35 + в цитатник
Qraizer:
Цитата Black_Dragon @
А что в стандарте не предусмотрено, что если ты столько не можешь, то вернуть нуль???
В Стандарте предусмотрено, что если allocation function не может вернуть блок запрошенного размера, то должна быть вызвана new-handler function, которая может быть установлена посредством std::set_new_handler(). Если таковой нет, должно быть брошено std::bad_alloc. Если таковая есть, то вызвать её и по возврату назад повторить попытку найти нужное количество памяти, и далее по циклу. В свою очередь к new-handler function предъявляются требования либо найти сколько-нибудь места и вернуть управление, либо бросить std::bad_alloc или производный от него, либо завершить программу без возврата. Учитывая, что требования к new-handler function обязан учитывать сам программист, который такую собрался писать, понятно, что любые несоответствия Стандарту тут, если таковые будут, следует предъявлять к нему, а не Стандарту.
В черновике C++17 я не нашёл требования, как именно в последнем случае программа должна завершаться, однако во всех релизах Стандарта есть замечательная std::terminate(), как будто бы спецом для этого. На самом деле есть чёткий список, когда std::terminate() будет вызываться, и new-handler function там отсутствует. Вероятно, из-за того, что гарантировать соблюдение этих требований Стандарт в принципе не в состоянии, не от него это зависит.
Цитата Black_Dragon @
Мы то получаем валидный указатель, но на меньший объем...
Вот уж чего точно не может быть ни в коем случае. Если вдруг кто-то увидит перегруженный new который позволяет себе вести себя подобным образом, пусть смело кидает автору пожизненный страйк без выходного пособия.

Добавлено
P.S. Ты уверен, что правильно size_t приготовил, Black_Dragon? Например, 5*1024*1024*1024 – это неправильно. И даже 0x140000000 тоже неправильно.

Добавлено
P.P.S. В Стандарте предусмотрено сразу вернуть nullptr безо всяких new-handler function, но для этого вызывать нужно не просто new, а new (std::nothrow).

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842357

Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку