std::shared_ptrを使うに当たり、自分のポインタをshared_ptrで誰かに渡したいことがある。
当然thisを使うのだが、
auto ptr = shared_ptr(this); // NG
こんなことをしてはいけない。thisを使いたい場合、そのクラスをenable_shared_from_thisクラスからpublic継承し、shared_from_this関数を用いてthisを取得する必要がある。その際、以下のことに気を付ける必要がある
①.thisを使いたいときはenable_shared_from_thisを継承する
②.コンストラクタの中でshared_from_thisを使ってはいけない
③.自分自身がshared_ptrで管理されていなければならない
#include <memory> #include <iostream> // ① OK enable_shared_from_this を使う class myData: public std::enable_shared_from_this<myData>{ int i; public: myData(){ //②NG コンストラクタでshared_from_thisを使ってはいけない std::cout << shared_from_this()->i << std::endl; }; void func(){ //②OK thisの取得にshared_from_thisを使う std::cout << shared_from_this()->i << std::endl; } }; /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// int _tmain(int argc, _TCHAR* argv[]) { //③ enable_shared_from_thisを使う場合は、自信もshared_ptrで管理されなければならない myData data1;// ③ NG myData *data2 = new myData;// ③ NG // ③ OK std::shared_ptr<myData> data3 = std::shared_ptr<myData>( new myData ); // ③ OK std::shared_ptr<myData> data4 = std::make_shared<myData>(); data4->func(); getchar(); return 0; }