がりらぼ

WindowsRuntimeの応援ブログ

shared_ptrはインスタンス破棄時にデストラクタを呼ぶ

shared_ptrを使う - がりらぼ
こんな記事を投稿したらしばやん大先生(しばやん (shibayan) on Twitter)に

といわれたので試してみる。

とりあえずコンストラクタとデストラクタがあり、呼ばれたタイミングがわかるように出力を行うクラスを作る

#include <iostream>

class Hoge{
public:
	Hoge(){
		std::cout << "Call Constractor"<<std::endl;
	}
	~Hoge(){
		std::cout << "Call Destractor"<<std::endl;
		
	}
	int hogeValue;
};

Mainから呼ぶ

#include<iostream>
#include<memory>
#include"Hoge.h"

using namespace std;


int main(){
        //参照カウンタが1増える
	shared_ptr<Hoge> hoge=make_shared<Hoge>();
	
	int a;
	cin >> a;
}

これで実行してみると結果はこうなる

Call Constractor

参照カウンタが1増えて、入力待機状態となるので
コンストラクタだけが呼ばれる。

次にインスタンスにnullptrを入れ、参照カウントを0にしてみる

#include<iostream>
#include<memory>
#include"Hoge.h"

using namespace std;


int main(){
	shared_ptr<Hoge> hoge=make_shared<Hoge>();
	
	hoge = nullptr;
	
	int a;
	cin >> a;
}

結果

Call Constractor
Call Destractor

ようするに、shared_ptrは参照カウンタが0になるとインスタンス破棄されると同時にデストラクタが呼び出されるっていうしばやん大先生の言うとおりってことですね!!!

shared_ptrはMSDNのサンプルでも当たり前のようにつかわれてるのでつかえて損はない