名前の所以は、「あるオブジェクトの所有権を持つunique_ptrは、 ただ一つのみである」ところにあります。具体的には37行目のように一つのオブジェクトを二つのunique_ptrに割り当てようとするとエラーになりますが、38行目のように所有権の移動(move)をするのはOKです。この操作の後ではptrはオブジェクトを所有していない状態になります。unique_ptrはオーバーヘッドがほとんどなく、通常のポインタに匹敵する処理速度で、余計なメモリ領域も使わないので他のスマートポインタを使う必要がなければこれを使います。 https://wiki.kek.jp/pages/viewpage.action?pageId=127280337 ============================================================== // とりあえず、最初のところはあまり気にせず、function()の行から見ましょう。 #include #include class Particle { protected: std::string m_name; double m_mass; public: Particle(std::string name, double mass): m_name(name), m_mass(mass) {} const std::string& GetName() const { return m_name; } double GetMass() const { return m_mass; } }; //void function() void unique_ptr_try() { // unique_ptrを作成 auto ptr = std::make_unique("Z", 91.2); // 使うときは普通のポインタのように扱います。 std::cout << ptr->GetName() << " " << ptr->GetMass() << std::endl; // オブジェクトの置き換え // 元のオブジェクト(Z)は自動的にdeleteされます。 ptr = std::make_unique("W", 80.4); std::cout << ptr->GetName() << " " << ptr->GetMass() << std::endl; // auto ptr2 = ptr; // エラー ! コピーはできない。 auto ptr2 = std::move(ptr); // ムーブはOK std::cout << ptr2->GetName() << " " << ptr2->GetMass() << std::endl; return; } // ptr2が所有しているオブジェクト(W)は自動的に解放されます。 ================================================ Processing unique_ptr_try.C... Z 91.2 W 80.4 W 80.4