为什么这个ATL / COM代码检查成功分配?我原本期望通过CoGetALloc或一些这样的api可以看到自定义分配。符合标准的C ++运行时应该抛出std :: bad_alloc,但是再一次可能分配器确实已被交换为非投掷impl。
DDClientData* pNewData = new DDClientData();
if (pNewData==NULL)
return E_OUTOFMEMORY;
答案 0 :(得分:1)
COM不使用异常:任何COM对象都应该在失败时返回有效的HRESULT
。另外,保证在退出时设置返回值,任何符合COM的对象必须遵守这些值。由于这些原因,COM / ATL的异常情况很糟糕,并且微软[1]内部完全没有使用,甚至分配都没有。上面显示的代码示例仅反映了该约定。
[1] Sez me,MS FTE。 MS中的COM组件在禁用C ++异常的情况下编译。
答案 1 :(得分:1)
不允许COM方法让异常退出 - 实现可以抛出异常,但它必须在它们转义方法之前处理它们并转换为适当的HRESULT。
上面的代码没有预期的效果 - 一旦new
失败std::bad_alloc
被抛出并且没有执行空指针的检查。实现必须将new
调用包装到try
- catch
或将整个方法实现包装到try
- catch
中。 ATL通常使用_ATLTRY - 就像new
调用周围的宏一样。