ページ 11

C++ shared_ptrの使い方

Posted: 2017年12月09日(土) 02:01
by Yak
shared_ptrを初めて使ったのですが、使い方が今一つ分からなかったので、質問させていただきます。

まず書き方なのですが、

コード:

std::shared_ptr<Hoge> fuga = std::shared_ptr<Hoge>(new Hoge());
であっているのでしょうか?見慣れないせいなのか少し変な書き方のように見えてしまい、あっているのか不安です

また、調べていてもmake_sharedの方が多く書かれていて、shared_ptrの説明が少ないように感じました。

違いが分からないので、この2つの何が違うのかも教えていただけたら幸いです。

どうぞよろしくお願いいたします。

Re: C++ shared_ptrの使い方

Posted: 2017年12月09日(土) 08:58
by V30
どちらでも同じような感じですが、安心・安全のため make_shared を使うのが常套です。

[参考]
https://msdn.microsoft.com/ja-jp/library/ee410595.aspx

解説にバッチリ書いていますよ。

Re: C++ shared_ptrの使い方

Posted: 2017年12月09日(土) 10:08
by かずま
Yak さんが書きました:

コード:

std::shared_ptr<Hoge> fuga = std::shared_ptr<Hoge>(new Hoge());
であっているのでしょうか?見慣れないせいなのか少し変な書き方のように見えてしまい、あっているのか不安です
間違ってはいませんが、通常は次のように書きます。

コード:

std::shared_ptr<Hoge> fuga(new Hoge());
Yak さんが書きました: また、調べていてもmake_sharedの方が多く書かれていて、shared_ptrの説明が少ないように感じました。

違いが分からないので、この2つの何が違うのかも教えていただけたら幸いです。
shared_ptrオブジェクトは、Hogeオブジェクトへのポインタと、
参照カウントオブジェクトへのポインタを持ちます。

shared_ptr のコンストラクタは、
参照カウントオブジェクトを new して、それを保持します。
引数で渡された Hogeオブジェトへのポインタも保持します。
デストラクタで、参照カウントオブジェクトの delete と
Hogeオブジェクトの delete を実行します。

make_shared で shared_ptrオブジェクトを生成すると、
一つの new で、Hogeオブジェクトと参照カウントオブジェクトの
領域を確保します。そして、shared_ptr のデストラクタでは、
一つの delete で領域を解放しますから、効率が良くなります。

Re: C++ shared_ptrの使い方

Posted: 2017年12月09日(土) 17:52
by Yak
回答ありがとうございました。

make_haredの方を勉強して使っていきたいと思います^^