为什么此ATL/COM代码检查成功的alloc?我会期望通过CoGetALloc或一些这样的API可以看到自定义分配。符合标准的C++运行时应该抛出std :: bad_alloc,但是也可能是分配器确实已经交易了一个非抛出impl。检查失败的新版本
DDClientData* pNewData = new DDClientData();
if (pNewData==NULL)
return E_OUTOFMEMORY;
为什么此ATL/COM代码检查成功的alloc?我会期望通过CoGetALloc或一些这样的API可以看到自定义分配。符合标准的C++运行时应该抛出std :: bad_alloc,但是也可能是分配器确实已经交易了一个非抛出impl。检查失败的新版本
DDClientData* pNewData = new DDClientData();
if (pNewData==NULL)
return E_OUTOFMEMORY;
COM方法不允许异常退出 - 实现可能会抛出异常,但它必须在它们转义该方法并转换为适当的HRESULT之前处理它们。
上面的代码将不会产生预期的效果 - 一旦new
失败std::bad_alloc
被引发,并且不执行对空指针的检查。该实现必须将new
调用包装为try
-catch
或将整个方法实现包装为try
-catch
。 ATL通常在调用new
时使用类似_ATLTRY的宏。
COM不使用例外:任何COM对象应该在失败时返回一个有效HRESULT
。另外还有关于退出时设置返回值的保证,任何符合要求的COM对象都必须遵守。由于这些原因,COM/ATL中的例外情况严重恶化,并且在微软[1]内部完全不使用,甚至不用于分配。上面显示的代码示例只是反映了该惯例。
[1] Sez me,MS FTE。 MS上的COM组件编译时禁用了C++异常。
所以,由于即时编译异常,代码是多余的。 – 2010-07-15 15:21:08