2009-07-15 9 views
1

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

createdestroy機能

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

を今私の問題を:リストはライブラリによって満たされている場合は、ライブラリのnewAnotherObject Sを作成するために呼び出されます。一方、リストが破棄されると、クライアントのdeleteAnotherObjectを破壊するために呼び出されます。この問題を避けるために私は何ができますか?

答えて

3
  1. std::list<shared_ptr<AnotherObject> >を使用してください。
  2. 適切な削除を呼び出すshared_ptrにカスタムの削除プログラムを渡します。
+0

それはプラグインシステムの一部であり、すべてのライブラリにはおそらく独自の新しい/削除があります。したがって、私はすべてのdeleterを収集する必要があります... – phlipsy

+0

2を実行する必要はありません。単に 'shared_ptr'を使用してください。"魔法のように "どの呼び出しが' delete'であるかを知っています –

+0

クライアントdllはメモリがどのように削除されているか知りません。 あなたの主なexeファイル内のすべてのオブジェクトを作成し、shared_ptrのdeleterとしてあなたのexeのcppのlibから削除を呼び出す関数を渡すことです。 – rpg

0

簡単な答えは、アプリケーションとライブラリの両方が同じバージョンのコンパイラでコンパイルされていることです。この場合、両方とも同じ新しい/削除バージョンが得られます。

+0

メインプログラムの演算子new/deleteを置き換えたものの、ライブラリはそれらを取得しないと仮定します。 – AProgrammer

+0

まあ、彼はどこでも彼がそれをしているとは言わない。 –

+0

これはプラグインシステムの一部です。したがって、他の標準ライブラリを持つ他の誰かが新しいプラグインを作成するとクラッシュしないことを何とか保証する必要があります。 – phlipsy

0

最も良い方法は、1人の演算子を新規に、1人の演算子をプログラム全体に対して削除することです。 (私は-Wl、 - export-dynamicを覚えていますが、それは異なるが関連した問題のためかもしれません)リンクオプションがあります。

これが不可能な場合は、すべての削除操作が新しいものと同じエンティティによって行われていることを確認してください。インライン関数では定義しないでください。

関連する問題