在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存

Releasing memory for DLL dynamically linked to CRT heap with the same version after calling FreeLibrary

本文关键字:版本 CRT 内存 DLL 堆的 FreeLibrary 调用 释放 链接 动态      更新时间:2023-10-16

根据我目前所读到的内容,通常建议使用std::shared_ptr、进程堆或DLL中的包装函数来释放DLL中分配的内存。然而,这是建立在应用程序和DLL可能不共享同一CRT版本的假设之上的,这可能会在应用程序释放DLL分配的内存时导致程序崩溃。

如果DLL明确链接到应用程序,并且两者都动态链接到CRT堆,并保证它们具有相同的CRT版本,那么按照正常方式分配/释放内存是否安全?(即,只有通常的new/delete,没有任何额外的东西(

此外,通过扩展,在DLL释放后,释放应用程序中DLL分配的内存是否安全?(即调用FreeLibrary后(

除了版本之外,主程序和DLL是否共享堆的相同副本也很重要。

在Visual Studio中,为了确保这一点,您必须在项目配置中指定:Runtime Library=多线程DLL或多线程调试DLL(/MD或/MDd(-在中同时指定DLL项目和主程序项目。