0

为什么此 ATL/COM 代码会检查分配是否成功?我本来希望通过 CoGetALloc 或一些这样的 api 可以看到自定义分配。符合标准的 C++ 运行时应该抛出 std::bad_alloc,但也许分配器确实已经被替换为非抛出 impl。

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

2 回答 2

1

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

[1] Sez me,MS FTE。MS 的 COM 组件是在禁用 C++ 异常的情况下编译的。

于 2010-06-28T14:43:20.903 回答
1

COM 方法不允许释放异常 - 实现可以抛出异常,但它必须在它们转义方法并转换为适当的 HRESULT 之前处理它们。

上面的代码不会有预期的效果——一旦new失败std::bad_alloc,就不会执行空指针检查。实现必须将new调用包装到try-catch或将整个方法实现包装到try- catch。ATL 通常在调用周围使用类似 _ATLTRY的宏new

于 2010-06-29T05:34:30.163 回答