将boost :: ptr_list从库传输到客户端

时间:2009-07-15 12:21:13

标签: c++ linux boost shared-libraries

我在C ++中动态加载库,如描述here

我的抽象基类看起来像这样:

#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));
}

create以及destroy函数

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来创建AnotherObject。另一方面,当列表被销毁时,调用客户端的delete来销毁AnotherObject。我该怎么做才能避免这个问题?

3 个答案:

答案 0 :(得分:3)

  1. 使用std::list<shared_ptr<AnotherObject> >
  2. 将自定义删除工具传递给调用正确删除的shared_ptr。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

最好的方法是为整个程序分配一个操作符new和一个operator delete。有链接选项可以帮助(我记得--Wl, - export-dynamic但它可能是一个不同但相关的问题)。

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