在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
Releasing memory for DLL dynamically linked to CRT heap with the same version after calling FreeLibrary
根据我目前所读到的内容,通常建议使用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项目和主程序项目。
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 用符号版本替换对函数的所有调用
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 我需要分发哪些版本的可再分发文件
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 在运行时读取 libstdc++ 版本
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 无论CRT版本如何,这都是在库中提供STL函数的有效方法吗
- atlbase.h 和不同版本的 VC CRT
- XP内嵌CRT版本问题.LoadLibraryEx失败
- 为什么具有CRT版本30729.4148的嵌入式清单的程序在运行时在winsxs文件夹中以30729.6161(最新)运
- 如何避免Windows上多个CRT版本的问题(dll地狱重访?)