【问题标题】:If i don`t release WICFactory(IWICImagingFactory*), What happen?如果我不发布 WICFactory(IWICImagingFactory*),会发生什么?
【发布时间】:2021-08-27 12:10:02
【问题描述】:

我正在学习 DirectX 2D。 当我关闭我的应用程序时,我注意到 IWICImagingFactory* 类型变量存在问题。

我在整个程序中只使用了一个 IWICImagingFactory* 变量。所以我在启动程序时启动它一次,在我关闭程序时销毁(释放)一次。

但如果我在调用 CoUninitialize() 函数后释放 IWICImagingFactory* 变量,则会出现错误。

Factorys::~Factorys()
{
    SAFE_RELEASE(mpD2DFactory);
    SAFE_RELEASE(mpWICFactory);
}

↓ 是韩语,意思是:错误抛出,访问冲突,“this->mpWICFactory->”是 0x6EEFC7D8

enter image description here

我注意到“this->mpWICFactory->”在调用 CoUninitialize() 后尝试释放 WICFactory 时出现问题。所以我在这里读到了 CoUninitialize():“https://docs.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-couninitialize”

我在链接中阅读了这部分内容:关闭当前线程上的 COM 库,卸载该线程加载的所有 DLL。

问题一:当我调用 CoUninitialize() 函数时,WICfactory 会自动释放?

问题 2:我必须在调用 CoUninitialize() 函数之前释放 WICFactory 吗?

【问题讨论】:

标签: com directx-11 wic


【解决方案1】:

是的,正如您在问题中提到的,CoUninitialize 将卸载所有依赖加载的库(WICFactory 就是其中之一)。 因此,尝试卸载已卸载的库会导致 AV 或其他错误。

释放 WICFactory 并不是“真正必要的”,因为 CoUninitialize 也会这样做(而且由于您在程序关闭时释放,即使您不调用 CoUninitialize,操作系统也会为您完成)。

但是,我强烈建议您仍然释放资源(所以是的,释放 WICFactory,然后调用 CoUninitialize ),拥有知道如何进行正确清理的代码从长远来看总是更好(无论您是否使用 smart指针与否,这取决于你)。

【讨论】:

  • 非常感谢!!真的很有帮助!
猜你喜欢
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 2012-01-13
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多