1

我在 C++ 中动态加载一个库,如此处所述

我的抽象基类如下所示:

#include <boost/ptr_container/ptr_list.hpp>
class Base {
public:
    virtual void get_list(boost::ptr_list<AnotherObject>& list) const = 0;
};

我的库现在提供了一个派生类Derived

class Derived : public Base { ... };

void Derived::get_list(boost::ptr_list<AnotherObject& list) const {
    list.push_back(new AnotherObject(1));
    list.push_back(new AnotherObject(2));
}

createdestroy函数

extern "C" {
    Base* create() { new Derived; }
    destroy(Base* p) { delete p; }
}

我的客户端程序加载库和两个createdestroy函数。然后它创建一个实例Derived并使用它:

Base* obj = create();
boost::ptr_list<AnotherObject> list;
obj->get_list(list);

现在我的问题:当列表被库填充时,new调用库来创建AnotherObjects。另一方面,当列表被销毁时,delete调用客户端来销毁AnotherObjects。我能做些什么来避免这个问题?

4

3 回答 3

3
  1. 使用std::list<shared_ptr<AnotherObject> >.
  2. 将自定义删除器传递给调用正确删除的 shared_ptr。
于 2009-07-15T12:58:36.517 回答
0

简单的答案是坚持应用程序和库都使用相同版本的编译器编译,在这种情况下,它们都将获得相同的新/删除版本。

于 2009-07-15T12:31:29.737 回答
0

最好的方法是为整个程序设置一个新运算符和一个删除运算符。有一些链接选项可以提供帮助(我记得 -Wl,--export-dynamic 但它可能是针对不同但相关的问题)。

如果这不可能,请确保所有删除操作都是由执行新操作的同一实体进行的,因此不要在内联函数中定义它们。

于 2009-07-15T12:36:07.697 回答