2011-01-10 11 views
0

ここは私の問題です。DLLを使用した多型のタイムドイベントのメモリの管理

私が作ったMy Guiライブラリは、時限イベントをサポートしています。基本的には、ユーザーが継承するTimedEventというクラスがあります。彼らはそれをします:

addTimedEvent(new DerivedTimedEvent(...)); 

しかし、私は時限イベントの性質を考えて、私はその後のメモリを管理します。

タイムイベントが処理を完了したら、私のライブラリはそのイベントを削除するように呼び出します。それはうまく動作しますが、それはexeとライブラリが両方ともmsvc 2008で構築されたからです。私は、ランタイムの2つのバージョン、1つはlib用、もう1つはexe用です。

これを解決するにはどうすればよいですか?派生型は物事のexe側にあるため、私はファクトリを作成できません。私はまた、彼らは時間を追跡する方法を持っていないか、イベントが何らかの理由で遅れていたかどうかを知ることができないので、ユーザーに削除を呼び出すように求めることもできません。

ありがとうございます。

答えて

1

TimecondEventクラスの構築パラメータとして、Dellocator Functorオブジェクトを取得してみてください。現在、派生クラスを作成するすべてのクライアントは、オブジェクトの削除中に呼び出すことができるDellocatorを提供することが期待されています。特別なケースとして単純に削除するデフォルトのdellocatorファンクタも必要です。

class base; 

class Deallocator { 
    void operator()(base* ptr) 
    { 
     delete ptr; 
    } 
} 

class base { 
public: 
base(Deallocator dealloc) 
{ 
    m_deleteFunc = dealloc; 
} 
~base() 
{ 
    m_deleteFunc(this); 
} 

private: 
Deallocator m_deleteFunc; 
} 

int main 
{ 
    Deallocator deletefunc; 

    base baseObj(deletefunc); 
} 
+0

あなたはこれの例がありますか? – jmasterx

+0

参照のためにサンプルイラストを使用して更新 – Neera

0

boost :: shared_ptrオブジェクトが実行できます。その理由は、Deleterが建設現場で作成されているため、あなたはcランタイムフーバーが進行中であっても適切なバージョンが呼び出されるからです。

+0

非ブースト、非C++ 0xの解決策は、私はあなたがそれを自分で書き換えることができ、うん – jmasterx

+0

スリムでポータブルそれを維持するために、私のライブラリにこれらを持参する必要はありません。それはあなたがそれをやり遂げ、すべてのキンクを解決するためにブーストの人々をしたように、それを行うために多くの費用がかかります。一方で、愚かではない競争相手があなたをパンチに倒して、おそらくより良い製品をブートすることになります。 –

関連する問題