shared_ptr

shared_ptrは、C++11で導入されたスマートポインタの一種で、リソースの所有権は複数のポインタで共有できる。
いくつのポインタから参照されているかを参照カウンタというもので数えていて、どれからも参照されていないとき、リソースが解放される。

shared_ptr - cpprefjp C++日本語リファレンス

p1.use_countでp1の参照カウンタが見えるので、それで確認する。

shared_ptrのp1を同じくshared_ptrのp2に代入するとどうなるか。

今度は、ブロックの中にshared_ptrのp3を定義し、p1をp3に代入、さらにp2の値を変更。

ここまでの参照カウンタを確認してみる。

p1.resetでp1の所有権を放棄。p2が残るので、値と参照カウンタを出力。

$ vi main.cpp 
$ g++ -o main main.cpp test.cpp -std=c++11
$ ./main 
class_test::class_test(10)
x_ = 10
p1.use_count() = 1

x_ = 10
p1.use_count() = 2
x_ = 10
p2.use_count() = 2

x_ = 20
p1.use_count() = 3
x_ = 20
p2.use_count() = 3
x_ = 20
p3.use_count() = 3

p1.use_count() = 2
p2.use_count() = 2

x_ = 20
p2.use_count() = 1
class_test::~class_test()
$

p1だけだと参照カウンタは1。
p2に代入で参照カウンタは2。
p3にもp1を代入すると参照カウンタは3に、p2に値20をセットすると、同じものを参照してるのですべての値が20に。
ブロックを抜けたら、p3は参照されなくなるので、参照カウンタは2に減る。
p1の所有権が放棄されると、参照してるのはp2のみなので、参照カウンタは1。

Sample/cpp/shared_ptr/shared_ptr/src/shared_ptr at master · bg1bgst333/Sample · GitHub