проверка на неисправные новые

почему этот код ATL / COM проверяет успешное выделение памяти? Я ожидал, что пользовательское выделение будет видно через CoGetALloc или какой-нибудь другой API. Среда выполнения C ++, соответствующая стандартам, должна выдавать std :: bad_alloc, но опять же, возможно, распределитель действительно был продан на не-бросающий impl.

DDClientData* pNewData = new DDClientData();
if (pNewData==NULL)
    return E_OUTOFMEMORY;

person Dustin Getz    schedule 28.06.2010    source источник


Ответы (2)


COM-методам не разрешено выпускать исключения - реализация может генерировать исключения, но она должна обрабатывать их, прежде чем они выйдут из метода и преобразуются в соответствующий HRESULT.

Приведенный выше код не даст желаемого эффекта - если new завершится ошибкой, будет выброшено std::bad_alloc и проверка на нулевой указатель не будет выполнена. Реализация должна либо обернуть вызов new в _4 _-_ 5_, либо обернуть всю реализацию метода в _6 _-_ 7_. ATL обычно использует макросы типа _ATLTRY вокруг new звонок.

person sharptooth    schedule 29.06.2010

COM не использует исключения: любой COM-объект должен возвращать действительный HRESULT в случае ошибки. Кроме того, существуют гарантии установки возвращаемых значений при выходе, которым должен соответствовать любой соответствующий COM-объект. По этим причинам исключения плохо работают с COM / ATL и вообще не используются внутри Microsoft [1], даже для выделения памяти. Пример кода, показанный выше, просто отражает это соглашение.

[1] Сказать мне, MS FTE. Компоненты COM в MS скомпилированы с отключенными исключениями C ++.

person JSBձոգչ    schedule 28.06.2010
comment
Итак, поскольку я компилирую с исключениями, код избыточен. - person Dustin Getz; 15.07.2010