C++のshared_ptrや左辺値/右辺値について勉強中です。
const参照で宣言した変数に、shared_ptrを返す関数で代入をした場合、参照カウンタが増加します。
これは参照ではなくコピーが発生しており、
const std::shared_ptr<Hoge>& x = foo.getHoge();
と
const std::shared_ptr<Hoge> x = foo.getHoge();
に差異はないということでしょうか?
右辺値(という認識)を参照に無理やり代入しようとすると、型変換が発生するということでしょうか。
shared_ptrの参照を返す関数で代入を行った場合は、参照カウンタは増加しません。
C++
1// hoge.h 2class Hoge { 3}; 4 5class Foo { 6public: 7 Foo() { 8 hoge = std::make_shared<Hoge>(); 9 } 10 std::shared_ptr<Hoge> getHoge() const { 11 return hoge; 12 } 13 14private: 15 std::shared_ptr<Hoge> hoge; 16}; 17
C++
1// hoge.cpp 2#include <iostream> 3#include "hoge.h" 4 5int main() { 6 Foo foo; // 参照カウンタ:0->1 7 8 std::cout << "foo.getHoge().use_count: " << foo.getHoge().use_count() << std::endl; // 2 9 10 { 11 const std::shared_ptr<Hoge>& x = foo.getHoge(); // 参照カウンタが増えている? 12 13 std::cout << "foo.getHoge().use_count: " << foo.getHoge().use_count() << std::endl; // 3 14 15 // 参照カウンタが減じている 16 } 17 18 std::cout << "foo.getHoge().use_count: " << foo.getHoge().use_count() << std::endl; // 2 19}
bash
1# 出力 2foo.getHoge().use_count: 2 3foo.getHoge().use_count: 3 4foo.getHoge().use_count: 2
なお、テストコードで、出力される参照カウンタ数が1大きいのは、
getHoge().use_count()
を呼ぶ瞬間にコピーが発生して参照カウンタが増加しているからです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/31 14:06 編集