Com 检查失败的新

Com 检查失败的新,com,atl,new-operator,allocator,Com,Atl,New Operator,Allocator,为什么这个ATL/COM代码检查alloc是否成功?我希望通过CoGetALloc或类似的api可以看到自定义分配。符合C++运行时的标准应该是抛出STD::BADYOLLC,但可能再次分配了一个非抛出IMPL。 DDClientData* pNewData = new DDClientData(); if (pNewData==NULL) return E_OUTOFMEMORY; COM不使用异常:任何COM对象都应该在失败时返回有效的HRESULT。此外,还有关于在退出时设置返回

为什么这个ATL/COM代码检查alloc是否成功?我希望通过CoGetALloc或类似的api可以看到自定义分配。符合C++运行时的标准应该是抛出STD::BADYOLLC,但可能再次分配了一个非抛出IMPL。
DDClientData* pNewData = new DDClientData();
if (pNewData==NULL)
    return E_OUTOFMEMORY;

COM不使用异常:任何COM对象都应该在失败时返回有效的
HRESULT
。此外,还有关于在退出时设置返回值的保证,任何符合条件的COM对象都必须遵守。由于这些原因,异常在COM/ATL中的作用不好,在Microsoft内部根本没有使用[1],甚至没有用于分配。上面显示的代码示例仅反映了该约定


[1] 我是一名微软全职员工。在MS中的COM组件是用C++异常编译的。

< P> com方法不允许异常发生。实现可以抛出异常,但必须在它们逃出方法并转换成适当的HESUTE之前处理它们。< /P>
上述代码不会产生预期效果-一旦
new
失败,就会抛出
std::bad_alloc
,并且不会执行空指针检查。实现必须将
new
调用包装到
try
-
catch
中,或者将整个方法实现包装到
try
-
catch
中。ATL通常在
new
调用中使用类宏。