首页 > 解决方案 > 如果我不发布 WICFactory(IWICImagingFactory*),会发生什么?

问题描述

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

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

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

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

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

在此处输入图像描述

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

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

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

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

标签: comdirectx-11wic

解决方案


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

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

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


推荐阅读