読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

shared_ptrを使う

C++はよくdeleteしなければならないとか
deleteし忘れるとか

C#ではガベージコレクションがやってくれた「何からも参照されなくなったら破棄」ということをC++はデフォルトではやってくれません。

しかしながらC++11からshared_ptrというスマートポインタが導入されました。

shared_ptrとは

shared_ptrはオブジェクトのライフタイムを管理するスマートポインタである。 shared_ptrはコピーに対応しており、shared_ptr自身が一体いくつの変数から自身が管理するインスタンスを参照しているのかをカウントしている。 このカウントが 0 になる、つまりどの変数からも参照されなくなった瞬間、shared_ptrは自身が管理していたインスタンスをデリータによって削除する。 shared_ptrは非常に有用だが、循環参照が発生した場合、正しくインスタンスを削除することができなくなってしまう。 これは weak_ptrクラスと併用することで解決できることがある。
shared_ptr(C++11) - cpprefjp - C++ Library Reference

結構MSDNのVisualC++のサンプルコードにはshared_ptrが使われています。

使い方は

#include<memory>

をインクルードすると

std名前空間に存在する(ように見せかけることができる?らしい)

using namespace std;
shared_ptr<Hoge> hoge(new Hoge());

インスタンス化が可能

または

shared_ptr<Hoge> hoge=make_shared<Hoge>("コンストラクタ引数");

でもインスタンス化が可能

これを作ったらdeleteせずにすむので安心?

サンプルコード
main.cpp

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

using namespace std;


int main(){
	shared_ptr<Hoge> hoge=make_shared<Hoge>();

	cout<<hoge->hogeValue<<endl;
	
}

Hoge.h

class Hoge{
public:
	Hoge(){
		hogeValue = 3;
	}
	int hogeValue;
};

結果

3