c++ - DLL 内存管理器混淆

标签 c++ windows memory dll

我写了一个应用程序,允许人们贡献插件来扩展功能。这些插件被部署为 DLL 文件,框架在运行时获取这些文件。每个插件都有一个工厂函数,在应用程序的生命周期中多次调用该函数来创建对象。到目前为止,为了处理这些对象的所有权问题,我对返回的对象使用了一个简单的计数共享指针,以便在删除最后一个引用时销毁它们。

但是,这往往会在 Windows 上触发崩溃,因为在插件 DLL 中新建对象但稍后(由于对共享指针的 deref() 调用)在主应用程序中删除的情况并非不可能发生 -据我所知,这种 malloc/free 混合在 Windows 上是禁忌。

我目前的解决方案是让 deref() 不调用“删除这个;”直接而是一个'release();'必须由插件实现的功能,并调用“删除这个;”。然而,每个插件都必须实现这个微不足道的功能是非常烦人的——到目前为止,我通过提供一个方便的宏插件作者必须使用来解决这个问题。有人有其他想法吗?

到目前为止,我的方法是插件提供的所有对象都在插件中分配并在那里释放 - 当然,另一种方法可能是让所有内存在主应用程序中分配(通过提供指向 malloc 的指针-like function to the plugins 然后他们可以根据需要调用)并在那里发布。我认为,这样做的问题是插件作者不太方便。

我对这个问题的任何其他观点感兴趣。

更新:我刚刚意识到我可以在插件返回的对象的基类上重新实现 operator new 和 operator delete,这样新建和删除它们总是会导致函数调用同一模块(以便所有分配和释放都在插件或框架中完成)。

最佳答案

事实证明,确保内存不在一个 DLL 中分配而在另一个 DLL 中释放的最简单方法是:在从插件返回的对象的基类。在这些函数的实现中,调用“alloc”和“free”函数(加载插件时已从主应用程序传递过来)。这样,插件可以继续使用“新建”和“删除”,但实际上会在主应用程序中分配和释放内存。

关于c++ - DLL 内存管理器混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1085873/

相关文章:

c - 文件部分用c发送

c++ - 如何从 DLL 中检索数组变量? (视觉 C++)

java - 还有其他方法可以从 Java 运行 .exe 吗?

c++ - 在 Windows 上开始使用 OpenGL ES 2.0

有人可以告诉我为什么会出现这个运行时错误吗?

ios - iOS 8.3 iPhone 6 Plus 虚拟内存超过1.5GB 容易死机

linux - 进程smaps中 "Referenced"的含义

c++ - 给定一个数组,是否有算法可以从中分配内存?

c++ - 使用运算符重载表格

c++ - 如何将许多格式字符串打印到窗口中?