众所周知,堆内存的释放必须使用与分配它的分配器相同的分配器来完成。在跨 DLL 边界交换堆分配的对象时需要考虑这一点。
一种解决方案是为每个对象提供一个析构函数,就像在 C API 中一样:如果 DLL 允许创建对象 A,则它必须提供一个函数A_free或类似的东西1。
另一个相关的解决方案是将所有分配包装到其中,因为它们存储到释放器2shared_ptr的链接。
另一种解决方案是将顶级分配器“注入”到所有加载的 DLL(递归地)3中。
另一种解决方案是不交换堆分配的对象,而是使用某种协议4。
另一种解决方案是绝对确保 DLL 将共享相同的堆,如果它们共享兼容的编译选项(编译器、标志、运行时等),则应该(将会?)发生这种情况5 6。这似乎很难保证,特别是如果人们想使用包管理器而不是立即构建所有内容。
有没有办法在运行时检查多个 DLL 之间的堆实际上是否相同,最好以跨平台的方式?
为了可靠性和易于调试,这似乎比希望应用程序立即崩溃而不是默默地破坏东西更好。
我对Windows如何管理.dll的内存几乎没有疑问.
当.dll加载到主机进程时,如何管理内存?
.dll是否可以访问主机进程可用的整个内存或只是其中的一部分?即,当.dll中的函数分配内存时是否存在限制?
STL类如dll使用的字符串,向量(动态增加存储)等,在这里没有问题吗?
如何过载new和delete操作员dll.我已经将重载运算符写为dll的一部分,但是与此链接的客户端dll不使用overloaded new and delete