簡體   English   中英

std :: unique_ptr析構函數構造函數順序

[英]std::unique_ptr destructor constructor order

我想知道何時將新的unique_ptr分配給先前的unique_ptr,會發生什么。 在以下代碼中:

std::unique_ptr<my_class> test;
......
test = std::unique_ptr<my_class>(new my_class());
......
test = std::unique_ptr<my_class>(new my_class());

我預計當我第二次分配一個新的std :: unique_ptr進行測試時,首先調用my_class的析構函數,然后調用它的構造函數。 我的預期是錯的嗎? 但是當我調試我的代碼時,我看到的是反向的。 my_class的第一個構造函數調用然后調用它的析構函數。

在前一個實例的析構函數之前調用構造函數的原因是因為您將new my_class()作為參數傳遞給unique_ptr的構造函數。 首先評估參數,構造一個新的unique_ptr實例,該實例獲取新創建的對象的所有權,然后將新的unique_ptr實例分配給舊的。

因此,它將擁有所有權的舊unique_ptr的my_class對象將被解除分配並銷毀,從而調用my_class析構函數。

它實際上和你寫的一樣:

my_class* temp = new my_class;
test = std::unque_ptr<my_class>(std::move(temp));

在這里可以直接看到首先構造新對象。

cppreference

unique_ptr& operator=( unique_ptr&& r ) noexcept; (1)
template< class> U, class E > unique_ptr& operator=( unique_ptr<U,E>&& r ) noexcept; (1)

從所有權轉移r*this ,仿佛調用reset(r.release())隨后的分配get_deleter()std::forward<E>(r.get_deleter())

正如您所看到的,在前一個指針上調用了reset ,它執行以下操作:

  1. 保存當前指針old_ptr = current_ptr的副本
  2. 使用參數current_ptr = ptr覆蓋當前指針
  3. 如果舊指針非空,則刪除先前管理的對象if(old_ptr != nullptr) get_deleter()(old_ptr)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM