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

时间:2015-07-26 11:42:58

标签: c++ directx direct2d

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

示例:

ID2D1GeometrySink * pSink;

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

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

2 个答案:

答案 0 :(得分:3)

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

因此,如果方法返回一个接口指针,则调用者负责释放该指针。

通常,我们永远不知道返回指针的性质。在这种特殊情况下,我们不知道在此方法中是否分配了ID2D1GeometrySink,或者这是一个预先创建的对象。管理返回指针需要了解的所有内容是,当您不需要此指针时,应该调用Release。

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

答案 1 :(得分:1)

这里有几个问题。

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

它会泄漏内存吗?

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