проверка на новый не удалось - PullRequest
0 голосов
/ 28 июня 2010

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

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

Ответы [ 2 ]

1 голос
/ 29 июня 2010

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

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

1 голос
/ 28 июня 2010

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

[1] Sez me, MS FTE.Компоненты COM в MS компилируются с отключенными исключениями C ++.

...