com - 如果我不发布 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 吗?
解决方案
是的,正如您在问题中提到的,CoUninitialize 将卸载所有依赖加载的库(WICFactory 就是其中之一)。因此,尝试卸载已经卸载的库会给您带来 AV 或其他错误。
释放 WICFactory 并不是“真正必要的”,因为 CoUninitialize 也会这样做(而且由于您在程序关闭时释放,即使您不调用 CoUninitialize,操作系统也会为您完成)。
但是,我强烈建议您仍然释放资源(所以是的,释放 WICFactory,然后调用 CoUninitialize ),拥有知道如何进行正确清理的代码从长远来看总是更好(无论您是否使用智能指针, 那取决于你)。
推荐阅读
- c# - 使用 Windows 服务进行 Git 身份验证
- bash - 使用 JAVA_HOME=... 和 export JAVA_HOME=$(...) 的区别
- python - 有没有办法使用熊猫导入几个 .txt 文件,每个文件都成为一个单独的数据框?
- javascript - 之前通过 jQuery/JSON 建立的单独链接在点击时效果很好,现在只有一个按钮在工作,而其他按钮不可点击
- pyspark - 什么是 Apache Spark 中的数据局部性?
- javascript - 仅在使用 useEffect 卸载组件时执行功能
- algorithm - 如何从 perl 中的列表中获取未知模式?
- ruby-on-rails - 制作下拉菜单并在 Rails 中获取值
- java - 打印数字随着它减少但它跳过了应该打印的东西
- python - 为什么在 Google Colab 中运行此 python 代码时我没有得到任何结果