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
類型為 rvalue
的 std::nullptr_t
。
Ptr
pointer
。
Deleter
繫結至 deleter
的 unique_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
配置資源)。 默認值deleter
default_delete<T>
假設 所ptr
指向的資源是使用 new
來配置,而且可以藉由呼叫 delete _Ptr
來釋放。 (部分特製化unique_ptr<T[]>
會管理使用 new[]
設定的陣列物件,並具有預設deleter
default_delete<T[]>
的 ,專門呼叫 delete[] ptr
。)
自有資源的儲存指標 stored_ptr
具有類型 pointer
。 Del::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_deleter
至 stored_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_ptr
與 right.stored_ptr
,以及交換 stored_deleter
與 right.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_ptr
的 deleter
。
right
rvalue reference
指向 unique_ptr
,而 unique_ptr
欄位從其中移動指派為新的已建構 unique_ptr
。
備註
前兩個建構函式建構不管理任何資源的物件。 第三個建構函式會將 ptr 儲存在 中 stored_ptr
。 第四個建構函式儲存 stored_ptr
中的 ptr
和 stored_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)
。