【发布时间】:2010-11-08 07:46:00
【问题描述】:
我编写了一个应用程序,它允许人们贡献插件来扩展功能。此类插件部署为 DLL 文件,框架在运行时获取这些文件。每个插件都有一个工厂函数,该函数在应用程序的生命周期内被多次调用以创建对象。到目前为止,为了处理这些对象的所有权问题,我在返回的对象上使用了一个简单的计数共享指针,以便在删除最后一个引用时销毁它们。
但是,这往往会在 Windows 上触发崩溃,因为在插件 DLL 中新建对象但后来(由于对共享指针的 deref() 调用)在主应用程序中删除的可能性不大 -并且 AFAIK 这种 malloc/free 混合在 Windows 上是一个禁忌。
我目前对此的解决方案是让 deref() 不调用 'delete this;'直接而是一个'release();'必须由插件实现并调用“删除此;”的功能。然而,每个插件都必须实现这个微不足道的功能,这很烦人——到目前为止,我通过提供一个方便的宏插件作者必须使用来解决这个问题。可能有人有其他想法吗?
到目前为止,我的方法是插件贡献的所有对象都在插件中分配并在那里释放 - 当然,另一种方法可能是让所有内存在主应用程序中分配(通过提供指向 malloc 的指针- 类似插件的功能,然后他们可以根据需要调用)并在那里发布。我认为这样做的问题是它对插件作者来说不太方便。
我会对此问题的任何其他观点感兴趣。
更新: 我刚刚意识到我可以在插件返回的对象的基类上重新实现 operator new 和 operator delete,这样新建和删除它们总是会导致函数调用到同一个模块(以便所有分配和释放都在插件或框架中完成)。
【问题讨论】: