Оператор new с пустым конструктором вызова спецификации исключения, когда выделение возвращает 0C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Оператор new с пустым конструктором вызова спецификации исключения, когда выделение возвращает 0

Сообщение Anonymous »

У меня есть следующее объявление:

Код: Выделить всё

void * operator new (size_t s, PersistentMemory * m) throw() {
return m->allocatePersistentMemory(s);
}
Я тестирую нехватку памяти при запуске, в результате чего m->allocatePersistentMemory(s); возвращает 0. Затем New вызывает для этого конструктор с нулевым указателем
Однако на основе 3.7.3.1 параграфа 3 стандарта C++ 2003:

Функция распределения, которая не удалось выделить хранилище, можно вызвать
установленный в данный момент new_handler (18.4.2.2), если таковой имеется. [Примечание:
обеспечиваемая программой функция выделения может получить адрес
установленного в данный момент new_handler с помощью функции set_new_handler
(18.4.2.3). ] Если функция выделения, объявленная с пустой
спецификацией исключения (15.4), throw(), не может выделить память, она
вернет нулевой указатель. Любая другая функция распределения, которая не может
выделить память, должна указывать на ошибку только путем выдачи
исключения класса std::bad_alloc (18.4.2.1) или класса, производного от
std::bad_alloc.

Я понимаю, что если m->allocatePersistentMemory(s) возвращает значение null, оно должно в результате весь оператор new() throw() вернет значение null без вызова конструктора. Я пропустил какое-то другое условие, которое переопределяет это?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/115 ... en-allocat
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»