スポンサーリンク

| キーワード:

std::shared_ptrでthisを使いたい時に注意すること

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

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: