hereのようにC++でライブラリを動的に読み込みます。boost :: ptr_listをライブラリからクライアントに転送
私の抽象基底クラスは次のようになります。
#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; }
}
私のクライアントプログラムを提供ライブラリと2つの012をロードするおよびdestroy
機能そして、それはDerived
のインスタンスを作成し、それを使用しています:
Base* obj = create();
boost::ptr_list<AnotherObject> list;
obj->get_list(list);
を今私の問題を:リストはライブラリによって満たされている場合は、ライブラリのnew
はAnotherObject
Sを作成するために呼び出されます。一方、リストが破棄されると、クライアントのdelete
がAnotherObject
を破壊するために呼び出されます。この問題を避けるために私は何ができますか?
それはプラグインシステムの一部であり、すべてのライブラリにはおそらく独自の新しい/削除があります。したがって、私はすべてのdeleterを収集する必要があります... – phlipsy
2を実行する必要はありません。単に 'shared_ptr'を使用してください。"魔法のように "どの呼び出しが' delete'であるかを知っています –
クライアントdllはメモリがどのように削除されているか知りません。 あなたの主なexeファイル内のすべてのオブジェクトを作成し、shared_ptrのdeleterとしてあなたのexeのcppのlibから削除を呼び出す関数を渡すことです。 – rpg