std::unique_ptr 是 C++11 引入的獨佔所有權智能指針,不可複製,只能移動。旨在替代已棄用的 auto_ptr,提供數組支持(delete[])、自定義刪除器、零開銷抽象。
| 特性 | 說明 |
|---|---|
| 所有權 | 同一時刻僅一個 unique_ptr 擁有對象 |
| 複製構造/賦值 | 刪除(=delete),不可複製 |
| 移動構造/賦值 | 默認實現,所有權轉移 |
| 刪除器 | 默認 delete,支援 delete[] 及自定義 callable |
| 線程安全 | 無引用計數,非線程安全,性能接近裸指針 |
| 適用場景 | 單線程、明確所有權轉移、RAII 資源管理 |
{
std::unique_ptr p1(new Foo); // 構造
} // 離開作用域自動 delete p1
{
std::unique_ptr p2(new Foo[4]); // 構造數組
} // 自動 delete[] p2
struct D { void operator()(Foo* p) { std::cout << "custom delete\n"; delete p; } };
{
std::unique_ptr p3(new Foo); // 使用 D 刪除
}
std::unique_ptrp1(new Foo); p1->bar(); // 使用 { std::unique_ptr p2(std::move(p1)); // 所有權移給 p2 f(*p2); // p2 可用 p1 = std::move(p2); // 移回 p1 // p2 現在為空 p2->bar(); // UB!p2 為 nullptr } p1->bar(); // p1 再次有效
std::unique_ptrp1(new Foo[4]); { std::unique_ptr p2(std::move(p1)); f(p2[0]); p1 = std::move(p2); } p1[0].bar(); // OK
unique_ptr:明確所有權歸屬,避免洩漏。std::unique_ptr createFoo() { return std::make_unique(); } (C++14 make_unique)。vector<unique_ptr> 管理多態對象。fclose、CloseHandle、free、munmap 等。using FilePtr = unique_ptr; FilePtr fp(fopen("a.txt","r"), fclose); shared_ptr;需要弱引用打破循環 → 用 weak_ptr。TestDestroy................ Foo::Foo Foo::~Foo Foo::Foo Foo::Foo Foo::Foo Foo::Foo Foo::~Foo Foo::~Foo Foo::~Foo Foo::~Foo Foo::Foo D operator() Foo::~Foo TestOwner................ Foo::Foo Foo::bar f(const Foo&) Foo::bar destroying p2... Foo::bar Foo::~Foo TestArrayOwner................ Foo::Foo Foo::Foo Foo::Foo Foo::Foo Foo::bar f(const Foo&) Foo::bar destroying p2... Foo::bar Foo::~Foo Foo::~Foo Foo::~Foo Foo::~Foo