Direct 2D 在内存中留下指针吗?

does Direct 2D leaves pointers in the memory?

显然,在使用 Direct X 时,我们大量使用指针,但我在 MSDN 上找不到的问题是:Direct X 是否在内部使用 "new" 创建内存?

示例:

ID2D1GeometrySink * pSink;

path->Open(&pSink); // did this command use "new" internally?

在 MSDN 中,他们仅使用 pSink = NULL 从同一个变量创建多个接收器。那么会不会有内存泄漏呢?

这里有几个问题。

是的,对 path->Open 的调用会为您的接收器分配资源。 pSink 是一个指针,但您将 &pSink 传递给 Open 方法 - 指向该指针的指针。该调用获取几何接收器并将您的 pSink 变量设置为指向该接收器。它能做到这一点是因为你传递的是指针的地址而不是指针的值。

会不会泄漏内存?

是的,如果您在完成后不释放水槽。 The examples 对此很清楚,在完成对象后调用 SafeRelease(&pSink);

由于 DirectX 使用 COM,因此它必须遵循维护内存的 COM 规则。

所以如果一个方法returns一个接口指针,调用者负责释放这个指针。

一般来说,我们永远不知道返回指针的性质。在这种特殊情况下,我们不知道 ID2D1GeometrySink 是否在此方法中分配,或者这是一个预创建的对象。关于管理返回的指针,你需要知道的是,当你不需要这个指针时,你应该调用 Release。

此外,我建议使用在析构函数中调用 Release 的包装器,我的意思是 类,如 CComPtr 和其他。在这种情况下,您不需要自己调用 AddRef / Release。