2017-01-10 6 views
1

クラスに共有ptrを作成するときに、クラスデストラクタが2回コールされる問題があります。shared_ptrを作成するときにクラスデストラクターが2回呼び出される

私はオブジェクトのベクトルを作成しようとしており、各オブジェクトにはコンストラクタとデストラクタがあります。

私のような呼び出しを行うと:

サーボコントローラのコンストラクタが呼び出された後、すぐにサーボコントローラのためのデストラクタが一back機能も呼ばれるその前に、呼ばれ
std::vector<std::shared_ptr<ServoController>> servos; 
bool CreateServo(int id) 
{ 
    std::shared_ptr<ServoController> servo = std::make_shared<ServoController>(ServoController(id)); 
    servos.push_back(servo); 
} 

次に、アプリケーションを閉じると、ServoControllerのデストラクタが再度呼び出されます。しかし、コンストラクタはと今まではと呼ばれていました(私はベクトルに1つのオブジェクトしか持っていません)。少なくともコンストラクタを再び実行させるべきではありませんか?

私のクラスのベクトルを作る方法はありますか?ベクトル内の各オブジェクトについては、コンストラクタを一度呼び出す必要があり、オブジェクトがベクトルまたはベクトルから削除されるとデストラクタを一度呼び出す必要があります破壊されていますか?

おかげで、 -D

答えて

11

あなたが最初の(予期しない)デストラクタの呼び出しを引き起こしているものである。この呼び出しで一時オブジェクトを、作成しています。

std::make_shared<ServoController>(ServoController(id)); 

一連のイベントは次のとおりです。

  • ServoController(id)std::make_sharedに引数として渡される新しい一時オブジェクトを作成します。
  • std::make_shared<ServoController>ServoControllerコピーコンストラクタ(これはおそらくあなたが望むものではありません)に一時オブジェクトを転送します。このため、メインのコンストラクタは一度だけ呼び出されます。
  • これは、作成した一時的なコピーであるヒープ上に新しいオブジェクト(shared_ptrによって管理される)を作成します。
  • 一時オブジェクトはすぐに破棄されます。これはデストラクタを初めて呼び出すものです。

は、あなたが実際に欲しいのです:

std::make_shared<ServoController>(id); 

std::make_sharedは、そのテンプレート引数のコンストラクタに直接引数を転送します。そこに余分なコンストラクタコールは必要ありません。

+0

コピーコンストラクタではなく、呼び出された移動コンストラクタであった可能性があります。 –

関連する問題