显然,使用Direct X,我们正在大量使用指针,但我在MSDN上找不到的问题是:Direct X是否在内部创建了“new”内存?
示例:
ID2D1GeometrySink * pSink;
path->Open(&pSink); // did this command use "new" internally?
在MSDN中,他们只使用pSink = NULL
从同一个变量创建多个接收器。那会有任何内存泄漏吗?
答案 0 :(得分:3)
由于DirectX使用COM,因此必须遵循维护内存的COM规则。
因此,如果方法返回一个接口指针,则调用者负责释放该指针。
通常,我们永远不知道返回指针的性质。在这种特殊情况下,我们不知道在此方法中是否分配了ID2D1GeometrySink,或者这是一个预先创建的对象。管理返回指针需要了解的所有内容是,当您不需要此指针时,应该调用Release。
另外我建议使用在析构函数中调用Release的包装器,我的意思是像CComPtr这样的类。在这种情况下,您不需要自己调用AddRef / Release。
答案 1 :(得分:1)
这里有几个问题。
是的,对path->Open
的调用会为您的接收器分配资源。 pSink
是一个指针,但是您将&pSink
传递给Open
方法 - 指向指针的指针。调用获取几何接收器并将pSink
变量设置为指向该接收器。它可以这样做,因为你已经传递了指针的地址而不是指针的值。
它会泄漏内存吗?
是的,如果你完成后没有释放水槽。 The examples对此很清楚,在完成对象时调用SafeRelease(&pSink);
。