😺

スマートポインタ

2024/10/26に公開

std::shared_ptrは、指し示す先の変数が不要になったときに自動的に破棄することができる.
内部的には参照カウントという技術が使われている.
ポインタがコピーされるたびに参照カウントを増やす. 逆にポインタが破棄されるたびに参照カウントを減らしていき、参照カウントが0になった時点で指す先の変数を破棄する.

#include <iostream>
#include <memory>

struct A
{
	A(int a, int b) : a{a}, b{b} {}
	int a, b;
};

void Test(){
	// ポインタを生成. 参照カウント = 1
	// これは内部的にnew演算子を使って変数を生成し、受け取った引数を使って破棄する.
	std::shared_ptr<A> p = std::make_shared<A>(3,7);

	{
		// ポインタをコピー. 参照カウント→2
		std::shared_ptr<A> p2 = p;
		std::cout << p2->a << "," << p2->b << std::endl;
	} // ポインタを破棄. 参照カウント→1s
	std::cout << p->a << "," << p->b << std::endl;
}

Discussion