std::unique_ptr<int> a = std::make_unique<int>(5); の後に std::unique_ptr<int> b = a; と書くとどうなりますか?
std::unique_ptr は所有権を唯一のポインタだけが持つ設計で、コピーコンストラクタとコピー代入演算子が delete されています。そのため b = a; のようなコピーはコンパイル時にエラーになります。所有権を移したい場合は std::unique_ptr b = std::move(a); のようにムーブを使います。ムーブ後のaはnullptrになります。所有権を共有したい場合は参照カウント方式の std::shared_ptr を使うのが適切です。この仕組みによりリソースの二重解放を型システムで防げます。