std::unique_ptr<T,Deleter>::reset
來自 cppreference.com
< cpp | memory | unique ptr
unique_ptr<T> 主模板的成員 |
||
void reset( pointer ptr = pointer() ) noexcept; |
(1) | (C++23 起為 constexpr) |
特化 unique_ptr<T[]> 的成員 |
||
template< class U > void reset( U ptr ) noexcept; |
(2) | (C++23 起為 constexpr) |
void reset( std::nullptr_t = nullptr ) noexcept; |
(3) | (C++23 起為 constexpr) |
替換被管理的物件。
1,2) 等價於 auto old_ptr = get();
/* 將 “ptr” 賦值給儲存的指標 */
if (old_ptr)
get_deleter()(old_ptr);。
/* 將 “ptr” 賦值給儲存的指標 */
if (old_ptr)
get_deleter()(old_ptr);。
如果 get_deleter()(old_ptr) 丟擲異常,則行為未定義。
2) 此過載僅當
U
與 pointer
型別相同,或滿足以下所有條件時才參與過載決議:-
pointer
與element_type*
型別相同。 -
U
是指標型別V*
,使得V(*)[]
可以轉換為element_type(*)[]
。
3) 等價於 reset(pointer())。
目錄 |
[編輯] 引數
ptr | - | 指向要管理的新物件的指標 |
[編輯] 注意
要替換被管理的物件並提供新的刪除器,可以使用移動賦值運算子。
不執行自重置測試,即測試 ptr 是否指向已由 *this 管理的物件,除非作為編譯器擴充套件或除錯斷言提供。請注意,諸如 p.reset(p.release()) 這樣的程式碼不涉及自重置,只有諸如 p.reset(p.get()) 這樣的程式碼才涉及。
[編輯] 示例
執行此程式碼
#include <iostream> #include <memory> struct Foo // object to manage { Foo() { std::cout << "Foo...\n"; } ~Foo() { std::cout << "~Foo...\n"; } }; struct D // deleter { void operator() (Foo* p) { std::cout << "Calling delete for Foo object... \n"; delete p; } }; int main() { std::cout << "Creating new Foo...\n"; std::unique_ptr<Foo, D> up(new Foo(), D()); // up owns the Foo pointer (deleter D) std::cout << "Replace owned Foo with a new Foo...\n"; up.reset(new Foo()); // calls deleter for the old one std::cout << "Release and delete the owned Foo...\n"; up.reset(nullptr); }
輸出
Creating new Foo... Foo... Replace owned Foo with a new Foo... Foo... Calling delete for Foo object... ~Foo... Release and delete the owned Foo... Calling delete for Foo object... ~Foo...
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 2118 | C++11 | unique_ptr<T[]>::reset 拒絕限定轉換 |
接受 |
LWG 2169 | C++11 | 過載 unique_ptr<T[]>::reset(pointer) 存在 |
移除過載 |
[編輯] 參閱
返回指向託管物件的指標並釋放所有權 (public 成員函式) |