#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class Hoge {
public:
	Hoge() { cout << "Create Hoge!" << endl; }
	~Hoge() { cout << "Delete Hoge!" << endl; }
};

int main() {
	// unique_ptr と shared_ptr の違い
	
	shared_ptr<Hoge> dstSharedPtr;
	
	{
		unique_ptr<Hoge> uniquePtr(new Hoge());
		
		shared_ptr<Hoge> srcSharedPtr(new Hoge());
		cout << "srcPtr:" << srcSharedPtr << endl;

		dstSharedPtr = srcSharedPtr;	// このコピーで所有権が共有される

		// このスコープを抜けるとuniquePtr, srcShardPtrは両方破棄される。
		// uniquePtr で管理されている領域はこの瞬間に delete される。
		// 一方 srcSharedPtr は dstSharedPtr と所有権を共有したため
		// このタイミングではまだ delete されない。
	}

	// srcPtr と dstPtr が領域を指していることがわかる
	cout << "dstPtr:" << dstSharedPtr << endl;

	// この return のタイミングで dstSharedPtr で管理されていた領域が delete される。
	return 0;
}
