MS要码农关注这个问题,几乎不太现实
全局对象或者单例对象里随便定义一个std::string类型的成员,这个对象在析构时就会自动调用std::string的析构来释放内存。
不可能在DllMain()里写代码提前把每个std::string给先释放掉。
不过process main heap的锁在执行DLL_PROCESS_DETACH时会先拿住,所以process main heap的状态不会是不确定的。如果std::string是释放到process main heap里,就没问题。
稍微好一点的处理,是退进程时,先把所有的线程都停掉(包括码农自己开的线程,和OS API内部开的线程),只剩下主线程。
之后再执行ExitProcess()之类的操作,或者从exe的main()执行到CRT内部的退出代码。这些操作都在主线程里执行,也不会去杀线程(这是导致某些锁或者数据结构处于未确定状态的根因:线程执行到任意位置被杀),没有问题。
也就是说,需要从exe全局考虑,而不是靠单个dll自己来处理这个问题。
另外,除了ExitProcess()内部会杀线程,也要避免自己调用TerminateThread()去杀线程。
--
修改:z16166 FROM 114.254.115.*
FROM 114.254.115.*