掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DLL内部で動的に取得した変数を、実行モジュール側で開放する方法 (ID:70318)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
イメージだけどこんな感じかな。 そのまま動かせるプログラムじゃないよ。 <共通ヘッダー> //結果格納 クラス class Result{ //いろいろ } class IChecker { public: virtual int GetResult( IVectorResult * pResult ) = 0; virtual void Delete() = 0; }; class IVectorResult { public: virtual void push_back(Result&) = 0; }; <DLL実装> IVectorResult は、 vector<Result>のアダプターで 実装がEXEにあるようにして Checker::GetResultがm_aRetをコピーすればいいんじゃないの。 実装がEXEにあるからEXEでメモリ確保してEXEでメモリ解放することになる。 結局、DLL内の動的メモリ確保を、EXEで解放できているわけではなく、 どっちか一方に行わせているだけ。 m_aRetをコピーするので効率悪い感じもするが妥協。 class Checker : public IChecker { vector<Result> m_aRet; public: Checker(); ~Checker(); virtual int GetResult( IVectorResult * pResult ); virtual void Delete(); }; Checker::Delete() { delete this; } int Checker::GetResult(IVectorResult * pResult) { for( int i = 0; i < m_aRet.size(); i++ ) { pResult->push_back( m_aRet[i] ); } } <EXE実装> clas CVectorResult : IVectorResult { vector<Result>* m_p; public: virtual void push_back(Result&); void Attach(vector<Result>*); vector<Result>* Detach(); } void CVectorResult::push_back(Result& x) { m_p->push_back(x); } 使用例 CVectorResult a; vector<Result>& b; b.Attach(&a); TestP* d = FuctoryChecker(); d.hoge(); d.GetResult(&b); d.Delete(); d = NULL; b.Detach(); aに結果が入っているし、 EXEにあるCVectorResult::push_backを実行したので EXEで問題なく解放できる。 思いつきで書いたので動くかどうか知りません。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.