Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用FreeLibrary后释放动态链接到具有相同版本的CRT堆的DLL的内存_C++_Dll - Fatal编程技术网

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

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