#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;
}