昔はauto_ptr使ったりしたけど、もう古いそうです。問題あったらしい。
ネタ元
以下消えると困るのでコピペ
まずは基本的な使い方です。
コンストラクタに管理して欲しいリソースを渡すだけで使えます。
std::unique_ptr<リソース型> 変数名(リソースの生ポインタ);
後はスマートポインタの寿命と同時に自動的にリソースが開放されます。
配列かそうで無いかも自動で判断してdeleteとdeleteを呼び分けてくれます。*, ->, などの演算子もオーバーロードされているので主な使い方は生ポインタと同じです。
APIに渡す生ポインタが必要な時にはget()、明示的に開放したい場合はreset()なども可能です。
#include <memory> class Hoge { public: void Func() { } }; void funcRawPtr(int* raw) { } // テスト00 : 基本的な使い方 void test00() { // 組み込み型 { // 初期値0でintを確保 std::unique_ptr<int> a(new int(0)); // 生ポインタと同じように扱える *a = 10; } // delete不要、スコープを抜けると自動的に開放される // クラス { // Hogeを確保 std::unique_ptr<Hoge> hoge(new Hoge()); // 生ポインタと同じように扱える hoge->Func(); } // delete不要、スコープを抜けると自動的に開放される // 配列 { // int3個分を確保 std::unique_ptr<int[]> a(new int[3]); // 生ポインタと同じように扱える a[0] = 0; a[1] = 10; a[2] = 20; } // delete[]不要、スコープを抜けると自動的に開放される // 生ポインタとの互換 { std::unique_ptr<int> a(new int(10)); std::unique_ptr<int> b; // 何も指定しない場合中身はnullptrに // 関数の引数に生ポインタを要求される場合はget()で生ポインタを参照できる funcRawPtr(a.get()); // ポインタが有効かどうか判定できる if (a) { // ○ aは有効 } if (b) { // × bは無効 } } // 明示的な開放:その1 { std::unique_ptr<int> a(new int(10)); // reset()で明示的に開放することもできる a.reset(); if (a) { // × aは解放済み } } // 明示的な開放:その2 { std::unique_ptr<int> a(new int(10)); // reset()に新しいリソースを渡すと古いリソースを開放した後に新しいリソースへ更新できる a.reset(new int(20)); // 最初の10の分はここで同時に開放される if (a) { // ○ aの参照先の値は20 } } // 20の分はスコープを抜けると自動的に開放 }