C++ タスクシステム⑫ ~本プロジェクトへ移植したいが壁にぶつかる~
あいさつ
どうも、はかせです。
今回は今まで作ってきたもの(Subjectとか)を
本プロジェクトへ移植します。
ただ今回の記事は○○できましたではなく、
○○できなくて困ってます系記事です。
unique_ptrのカスタムデリータがわからない
一番の問題です。
というかこれが解決したらあとは完全移植完了です。
unique_ptrには解放時の処理をプログラマーが登録することが出来ます。
やり方はテンプレート第二引数に関数の型、もしくは関数オブジェクトを
渡すだけです。
私が作ったSubjectとReactivePropertyはどちらもデストラクタを非公開にして
解放関数を呼ぶかOnCompletedを受けて解放処理を行います。
なのでこの処理をカスタムデリータに指定して使おうとしました。
なんですが、カスタムデリータを指定したらインスタンス生成が
何故かうまくいかないんですよね・・・
今まで使っていたmake_uniqueは対応していないみたいなので
make関数なしで作っても入るのはnullptrのみ・・・・
スマートポインタなしで使って対応するクラスのデストラクタで
解放処理を呼んでいますが、このやり方はいつ解放忘れするか
分かったもんじゃないので早いとこどうにかしたいんですよね・・・・
最後にできなかったコードを載せます。
//関数オブジェクト template<class T> struct Deleter { void operator()(T* value) { value->Dispose(); } }; int main(int argc, char const* argv[]) { #if _DEBUG _CrtSetDbgFlag (_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF); #endif std::unique_ptr<ReactivePropaty<double>, Deleter<ReactivePropaty<double>>> doubleRP; //make関数は非対応の模様 doubleRP = std::make_unique<ReactivePropaty<double>, Deleter<ReactivePropaty<double>>>(); //これでもnullptrが入る doubleRP = std::unique_ptr<ReactivePropaty<double>, Deleter<ReactivePropaty<double>>>(); //使おうとしたらnullptrだった・・・・ doubleRP->Subscribe([&](double value)->void {std::cout << value << std::endl; }); *doubleRP = 1000; getchar(); //解放処理はカスタムデリータで呼ばれるはずだから割愛 getchar(); }
あとがき
今回はスマートポインタのカスタムデリータわからん記事でした。
今までのミスと違って糸口がさっぱり見えませんorz
諦めてデストラクタで逐一解放処理を書くしかないんですかね・・・
(なんか最近壁にぶつかってばっかな気がする)
それでは今回はこの辺でノシ