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