根据我到目前为止所读的内容,通常建议在DLL本身中使用std::shared_ptr
,进程堆或包装函数来释放DLL中分配的内存。但是,这是基于以下假设:应用程序和DLL可能不会共享相同的CRT版本,当应用程序释放DLL分配的内存时,这可能会导致程序崩溃。
如果DLL显式链接到应用程序,并且两者都动态链接到CRT堆并保证它们具有相同的CRT版本,那么按常规分配/释放内存是否安全? (即仅是常规的new
/ delete
,而没有任何其他内容)
此外,通过扩展,释放DLL后释放由DLL在应用程序中分配的内存是否安全? (即致电FreeLibrary
之后)
答案 0 :(得分:0)
除版本外,主程序和DLL是否共享相同的堆副本也很重要。
在Visual Studio中,为了确保这一点,您必须在项目配置中指定:运行时库=多线程DLL或多线程调试DLL(/ MD或/ MDd)-在两者中 DLL项目和主程序项目。