我在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; }
}
我的客户端程序加载了库以及两个create
和destroy
函数。然后它创建一个Derived
的实例并使用它:
Base* obj = create();
boost::ptr_list<AnotherObject> list;
obj->get_list(list);
现在我的问题:当库填充列表时,调用库的new
来创建AnotherObject
。另一方面,当列表被销毁时,调用客户端的delete
来销毁AnotherObject
。我该怎么做才能避免这个问题?
答案 0 :(得分:3)
std::list<shared_ptr<AnotherObject> >
。 答案 1 :(得分:0)
简单的答案是坚持使用相同版本的编译器编译应用程序和库,在这种情况下,它们将获得相同的新/删除版本。
答案 2 :(得分:0)
最好的方法是为整个程序分配一个操作符new和一个operator delete。有链接选项可以帮助(我记得--Wl, - export-dynamic但它可能是一个不同但相关的问题)。
如果无法做到这一点,请确保所有删除操作都由执行新操作的同一实体进行,因此不要在内联函数中定义它们。