DLL内存管理器的mixup(DLL memory manager mixup)

2019-06-25 03:06发布

我写了一个应用程序,它允许人们贡献的插件来扩展功能。 这些插件将部署为DLL文件,运行时其框架回升。 每个插件设有其被应用来创建对象的寿命期间被多次调用一个工厂函数。 到目前为止,为了处理这些对象的所有权问题,我用一个简单的计数共享指针在返回的对象,以便每当最后一个引用被移除它们被破坏。

然而,这往往会引发在Windows崩溃,因为它不是不可能发生的对象是在插件DLL new'ed但后来(由于在共享指针DEREF()调用)删除在主应用程序 - 并且这AFAIK的malloc /免费查询股价是一个没有没有在Windows上。

我目前的解决办法是让DEREF()不叫“删除;” 直接而是一个“释放();” 功能必须由插件和调用来实现“删除;”。 然而,这是相当烦人,每个插件必须实现这个小功能 - 我工作围绕这个迄今通过提供一个方便的宏插件作者必须使用。 没有任何人有替代的想法也许?

到目前为止,我的做法是,贡献的插件的所有对象的插件分配,并同时发布还有 - 当然,另一种可能是,让通过提供一个指向一个malloc样功能的所有存储在主应用程序分配(该插件其根据需要),并公布有作为,他们就可以调用。 这样做的问题是,它不是插件的作者一样方便,我想。

我很想对这个问题的任何其他观点。

更新:我刚刚意识到,我可以重新实现运营商新的和operator delete由插件返回的对象的基类,让他们new'ing并执行删除操作他们总是会导致函数调用到同一模块(所以,要么所有的分配和免费的都在插件中,或者在框架)来完成。

Answer 1:

有两个解决方案。 解决方案之一是“分享更多” - 你可以移动新/跨DLL边界删除,如果双方使用相同的CRT DLL(/ MD或MSVC / MDD)。 解决方案二是“共享少” - 让每个DLL有自己的C ++堆,不要分裂新/跨DLL边界删除。



Answer 2:

原来,最简单的方法,以确保内存中没有一个DLL分配和其他发布是这样的:重新实现operator newoperator delete的基类,它是从插件返回的对象。 在这些功能的实现中,调用“的alloc”和“无”功能(装载插件当已经从主应用程序传递)。 这样一来,插件可以继续使用“新”和“删除”,但内存实际上将被分配在主应用程序发布。



Answer 3:

如果DLL的代码是负责分配的对象,也应该负责释放他们。 我觉得你的问题是多与引用计数和“删除”。 如果你想要去的路线,为什么不干脆implemnt的对象作为COM对象? 这是该COM设计要解决的主要问题都是一个了!



文章来源: DLL memory manager mixup