问题目的:对DllMain
.
在 DllMain 中您不应该做太多事情是“常识”,有些事情绝对不能做,一些最佳实践。
我现在偶然发现了文档中的一个新宝石,这对我来说毫无意义:(emph。我的)
处理时,只有在动态卸载 DLL(参数为 NULL)时
DLL_PROCESS_DETACH
,DLL 才应释放堆内存等资源 。lpReserved
如果进程正在终止(lpvReserved 参数为非 NULL),则除当前线程外,进程中的所有线程要么已经退出,要么已被函数调用显式终止ExitProcess
,这可能会留下 一些进程资源,例如堆不一致的状态。在这种情况下,DLL 清理资源是不安全的。相反,DLL 应该允许操作系统回收内存。
由于全局 C++ 对象在 DllMain/DETACH 期间被清除,这意味着全局 C++ 对象不得释放任何动态内存,因为堆可能处于不一致状态。/ 当 DLL “静态链接”到可执行文件时。/ 当然不是我在那里看到的 - 各种(我们的和第三方的)库的全局 C++ 对象(如果有)在它们的析构函数中分配和解除分配就好了。(除非其他订购错误,oc)
那么,这个警告针对的是什么具体的技术问题呢?
既然段落中提到了线程终止,那么当某些线程没有正确清理时会出现堆损坏问题吗?