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。
显然,在使用 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。