А что в стандарте не предусмотрено, что если ты столько не можешь, то вернуть нуль???
В Стандарте предусмотрено, что если 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 там отсутствует. Вероятно, из-за того, что гарантировать соблюдение этих требований Стандарт в принципе не в состоянии, не от него это зависит.
Мы то получаем валидный указатель, но на меньший объем...
Вот уж чего точно не может быть ни в коем случае. Если вдруг кто-то увидит перегруженный new который позволяет себе вести себя подобным образом, пусть смело кидает автору пожизненный страйк без выходного пособия.
Добавлено
P.S. Ты уверен, что правильно size_t приготовил, Black_Dragon? Например, 5*1024*1024*1024 – это неправильно. И даже 0x140000000 тоже неправильно.
Добавлено
P.P.S. В Стандарте предусмотрено сразу вернуть nullptr безо всяких new-handler function, но для этого вызывать нужно не просто new, а new (std::nothrow).