2010-06-28 63 views
0

爲什麼此ATL/COM代碼檢查成功的alloc?我會期望通過CoGetALloc或一些這樣的API可以看到自定義分配。符合標準的C++運行時應該拋出std :: bad_alloc,但是也可能是分配器確實已經交易了一個非拋出impl。檢查失敗的新版本

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

回答

1

COM方法不允許異常退出 - 實現可能會拋出異常,但它必須在它們轉義該方法並轉換爲適當的HRESULT之前處理它們。

上面的代碼將不會產生預期的效果 - 一旦new失敗std::bad_alloc被引發,並且不執行對空指針的檢查。該實現必須將new調用包裝爲try-catch或將整個方法實現包裝爲try-catch。 ATL通常在調用new時使用類似_ATLTRY的宏。

1

COM不使用例外:任何COM對象應該在失敗時返回一個有效HRESULT。另外還有關於退出時設置返回值的保證,任何符合要求的COM對象都必須遵守。由於這些原因,COM/ATL中的例外情況嚴重惡化,並且在微軟[1]內部完全不使用,甚至不用於分配。上面顯示的代碼示例只是反映了該慣例。

[1] Sez me,MS FTE。 MS上的COM組件編譯時禁用了C++異常。

+0

所以,由於即時編譯異常,代碼是多餘的。 – 2010-07-15 15:21:08