2010-06-28 69 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