C++ 调用FreeLibrary后释放动态链接到具有相同版本的CRT堆的DLL的内存
从我到目前为止所读到的内容来看,通常建议在DLL本身中使用C++ 调用FreeLibrary后释放动态链接到具有相同版本的CRT堆的DLL的内存,c++,dll,C++,Dll,从我到目前为止所读到的内容来看,通常建议在DLL本身中使用std::shared_ptr、进程堆或包装函数来释放DLL中分配的内存。然而,这是建立在应用程序和DLL可能不共享同一CRT版本的假设之上的,这可能会在应用程序释放DLL分配的内存时导致程序崩溃 如果DLL显式链接到应用程序,并且两者都动态链接到CRT堆,并保证它们具有相同的CRT版本,那么按照正常方式分配/释放内存是否安全?(即,仅使用常规的新建/删除,无需任何额外内容) 此外,扩展一下,在DLL被释放后,在应用程序中释放DLL分配的
std::shared_ptr
、进程堆或包装函数来释放DLL中分配的内存。然而,这是建立在应用程序和DLL可能不共享同一CRT版本的假设之上的,这可能会在应用程序释放DLL分配的内存时导致程序崩溃
如果DLL显式链接到应用程序,并且两者都动态链接到CRT堆,并保证它们具有相同的CRT版本,那么按照正常方式分配/释放内存是否安全?(即,仅使用常规的新建
/删除
,无需任何额外内容)
此外,扩展一下,在DLL被释放后,在应用程序中释放DLL分配的内存是否安全?(即调用
FreeLibrary
后)除了版本之外,主程序和DLL是否共享堆的同一副本也很重要
在Visual Studio中,为了确保这一点,必须在项目配置中指定:运行时库=多线程DLL或多线程调试DLL(/MD或/MDd)-在DLL项目和主程序项目中。如果DLL显式链接到应用程序,并且两者都动态链接到CRT堆,并保证它们具有相同的CRT版本,则按照正常方式分配/释放内存是否安全?是的,只要你不混合调试和发布,你就可以了。这可能是安全的,但在不同的层中分配和删除是不好的设计。