unique_ptr 類別

儲存自有物件或陣列的指標。 沒有任何其他 unique_ptr 擁有此物件/陣列。 當 unique_ptr 終結時,物件/陣列也會終結。

語法

class unique_ptr {
public:
    unique_ptr();
    unique_ptr(nullptr_t Nptr);
    explicit unique_ptr(pointer Ptr);
    unique_ptr(pointer Ptr,
        typename conditional<is_reference<Del>::value, Del,
        typename add_reference<const Del>::type>::type Deleter);
    unique_ptr(pointer Ptr,
        typename remove_reference<Del>::type&& Deleter);
    unique_ptr(unique_ptr&& Right);
    template <class T2, Class Del2>
    unique_ptr(unique_ptr<T2, Del2>&& Right);
    unique_ptr(const unique_ptr& Right) = delete;
    unique_ptr& operator=(const unique_ptr& Right) = delete;
};

//Specialization for arrays:
template <class T, class D>
class unique_ptr<T[], D> {
public:
    typedef pointer;
    typedef T element_type;
    typedef D deleter_type;
    constexpr unique_ptr() noexcept;
    template <class U>
    explicit unique_ptr(U p) noexcept;
    template <class U>
    unique_ptr(U p, see below d) noexcept;
    template <class U>
    unique_ptr(U p, see below d) noexcept;
    unique_ptr(unique_ptr&& u) noexcept;
    constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { }     template <class U, class E>
        unique_ptr(unique_ptr<U, E>&& u) noexcept;
    ~unique_ptr();
    unique_ptr& operator=(unique_ptr&& u) noexcept;
    template <class U, class E>
    unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
    unique_ptr& operator=(nullptr_t) noexcept;
    T& operator[](size_t i) const;

    pointer get() const noexcept;
    deleter_type& get_deleter() noexcept;
    const deleter_type& get_deleter() const noexcept;
    explicit operator bool() const noexcept;
    pointer release() noexcept;
    void reset(pointer p = pointer()) noexcept;
    void reset(nullptr_t = nullptr) noexcept;
    template <class U>
    void reset(U p) noexcept = delete;
    void swap(unique_ptr& u) noexcept;  // disable copy from lvalue unique_ptr(const unique_ptr&) = delete;
    unique_ptr& operator=(const unique_ptr&) = delete;
};

參數

Right
unique_ptr

Nptr
類型為 rvaluestd::nullptr_t

Ptr
pointer

Deleter
繫結至 deleterunique_ptr 函式。

例外狀況

unique_ptr 未產生任何例外狀況。

備註

unique_ptr 類別會取代 auto_ptr,且可做為 C++ 標準程式庫容器的項目使用。

make_unique使用協助程式函式有效率地建立 的新實例 unique_ptr

unique_ptr 唯一管理資源。 每個 unique_ptr 物件儲存自有物件的指標或存放 null 指標。 資源只能由不超過一個 unique_ptr 物件擁有;當擁有特定資源的 unique_ptr 物件終結時,會釋放資源。 unique_ptr物件可能會移動,但無法複製;如需詳細資訊,請參閱 右值參考宣告子: &&

資源是透過呼叫 deleter 類型之預存 Del 物件釋放 (這個物件知道如何針對特定 unique_ptr 配置資源)。 預設 deleterdefault_delete<T> 假設 ptr 指向的資源是以 new 配置的,而且可以透過呼叫 delete _Ptr 釋放。 (部分特製化 unique_ptr<T[]> 會管理使用 new[] 配置的陣列物件,並具有預設 deleterdefault_delete<T[]> 的 ,專門呼叫 delete[] ptr 。)

自有資源的儲存指標 stored_ptr 具有類型 pointerDel::pointer如果已定義,則 T * 為 ,如果不是,則為 。 如果 deleter 是無狀態,預存 stored_deleter 物件 deleter 不會佔用物件的空間。 請注意,Del 可以是參考類型。

成員

建構函式

名稱 描述
unique_ptr unique_ptr 有七個建構函式。

Typedefs

名稱 描述
deleter_type Del 樣板參數的同義字。
element_type T 樣板參數的同義字。
pointer 如果已定義,Del::pointer 的同義字,否則為 T *

函式

名稱 描述
get 傳回 stored_ptr
get_deleter 傳回 stored_deleter的參考。
release pointer() 儲存在 stored_ptr,並傳回其之前的內容。
reset 釋放目前擁有的資源並接受新的資源。
swap 與所提供的 deleter 交換資源和 unique_ptr

操作員

名稱 描述
operator bool 運算子會傳回可以轉換成 bool 的類型值。 如果是 bool,轉換為 true 的結果是 get() != pointer(),否則為 false
operator-> 此成員函式會傳回 stored_ptr
operator* 此成員函式會傳回 *stored_ptr
operator= unique_ptr (或 pointer-type) 的值指派至目前的 unique_ptr

deleter_type

此類型是範本參數 Del的同義字。

typedef Del deleter_type;

備註

此類型是範本參數 Del的同義字。

element_type

此類型是範本參數 Type的同義字。

typedef Type element_type;

備註

此類型是範本參數 Ty的同義字。

get

傳回 stored_ptr

pointer get() const;

備註

此成員函式會傳回 stored_ptr

get_deleter

傳回 stored_deleter的參考。

Del& get_deleter();

const Del& get_deleter() const;

備註

成員函式會將參考傳回 stored_deleter

operator=

將提供的 unique_ptr 位址指派給目前的位址。

unique_ptr& operator=(unique_ptr&& right);
template <class U, Class Del2>
unique_ptr& operator=(unique_ptr<Type, Del>&& right);
unique_ptr& operator=(pointer-type);

參數

unique_ptr 參考用來將該值指派給目前的 unique_ptr

備註

此成員函式會呼叫 reset(right.release()) 並移動 right.stored_deleterstored_deleter,然後傳回 *this

pointer

如果已定義,Del::pointer 的同義字,否則為 Type *

typedef T1 pointer;

備註

如果已定義,則這個類型與 Del::pointer 同義,否則為 Type *

release

將傳回已儲存指標的擁有權釋放給呼叫者,並將已儲存的指標值設為 nullptr

pointer release();

備註

使用 release 接管 unique_ptr 所儲存的原始指標之擁有權。 呼叫端會負責刪除傳回的指標。 unique-ptr 已設為空白的預設建構狀態。 呼叫 unique_ptr 之後,您可以將相容類型的另一個指標指派至 release

範例

此範例顯示釋放呼叫者為何需負責傳回的物件:

// stl_release_unique.cpp
// Compile by using: cl /W4 /EHsc stl_release_unique.cpp
#include <iostream>
#include <memory>

struct Sample {
   int content_;
   Sample(int content) : content_(content) {
      std::cout << "Constructing Sample(" << content_ << ")" << std::endl;
   }
   ~Sample() {
      std::cout << "Deleting Sample(" << content_ << ")" << std::endl;
   }
};

void ReleaseUniquePointer() {
   // Use make_unique function when possible.
   auto up1 = std::make_unique<Sample>(3);
   auto up2 = std::make_unique<Sample>(42);

   // Take over ownership from the unique_ptr up2 by using release
   auto ptr = up2.release();
   if (up2) {
      // This statement does not execute, because up2 is empty.
      std::cout << "up2 is not empty." << std::endl;
   }
   // We are now responsible for deletion of ptr.
   delete ptr;
   // up1 deletes its stored pointer when it goes out of scope.
}

int main() {
   ReleaseUniquePointer();
}
Constructing Sample(3)
Constructing Sample(42)
Deleting Sample(42)
Deleting Sample(3)

reset

取得指標參數的擁有權,然後刪除原始的已儲存指標。 如果新的指標是與原始的已儲存指標相同,reset 會刪除指標,並將已儲存的指標設定為 nullptr

void reset(pointer ptr = pointer());
void reset(nullptr_t ptr);

參數

ptr
欲取得擁有權之資源的指標。

備註

使用 reset 將 所擁有的 unique_ptr 儲存 pointer 變更為 ptr ,然後刪除原始儲存的指標。 unique_ptr如果 不是空的,請在 reset 原始儲存的指標上叫用 所 get_deleter 傳回的 deleter 函式。

因為 reset 先儲存新的指標 ptr ,然後刪除原始儲存的指標,所以如果它與原始儲存的指標相同,就有可能 reset 立即刪除 ptr

swap

在兩個 unique_ptr 物件之間交換指標。

void swap(unique_ptr& right);

參數

right
使用 unique_ptr 交換指標。

備註

成員函式會交換 stored_ptrright.stored_ptr,以及交換 stored_deleterright.stored_deleter

unique_ptr

unique_ptr 有七個建構函式。

unique_ptr();

unique_ptr(nullptr_t);
explicit unique_ptr(pointer ptr);

unique_ptr(
    Type* ptr,
    typename conditional<
    is_reference<Del>::value,
    Del,
    typename add_reference<const Del>::type>::type _Deleter);

unique_ptr(pointer ptr, typename remove_reference<Del>::type&& _Deleter);
unique_ptr(unique_ptr&& right);
template <class Ty2, Class Del2>
    unique_ptr(unique_ptr<Ty2, Del2>&& right);

參數

ptr
要指派給 unique_ptr 之資源的指標。

_Deleter
要指派給 unique_ptrdeleter

right
rvalue reference 指向 unique_ptr,而 unique_ptr 欄位從其中移動指派為新的已建構 unique_ptr

備註

前兩個建構函式建構不管理任何資源的物件。 第三個建構函式會將 ptr 儲存在 中 stored_ptr 。 第四個建構函式儲存 stored_ptr 中的 ptrstored_deleter 中的 deleter

第五個建構函式儲存 stored_ptr 中的 ptr,並將 deleter 移動至 stored_deleter。 第六個和第七個建構函式儲存 stored_ptr 中的 right.release(),並將 right.get_deleter() 移動至 stored_deleter

~unique_ptr

unique_ptr 的解構函式,會終結 unique_ptr 物件。

~unique_ptr();

備註

此解構函式會呼叫 get_deleter()(stored_ptr)