簡體   English   中英

std::unique_ptr 構造函數行為

[英]std::unique_ptr constructor behaviour

首先,我知道我們應該使用std::make_unique()而不是調用std::unique_ptr構造函數,我知道為什么。

但是我正在查看std::unique_ptr的文檔以打發時間並加深對它的了解,我發現了以下有關構造函數用法的示例

// unique_ptr constructor example
#include <iostream>
#include <memory>

int main () {
  std::default_delete<int> d;
  std::unique_ptr<int> u1;
  std::unique_ptr<int> u2 (nullptr);
  std::unique_ptr<int> u3 (new int);
  std::unique_ptr<int> u4 (new int, d);
  std::unique_ptr<int> u5 (new int, std::default_delete<int>());
  std::unique_ptr<int> u6 (std::move(u5));
  std::unique_ptr<int> u7 (std::move(u6));
  std::unique_ptr<int> u8 (std::auto_ptr<int>(new int));

  std::cout << "u1: " << (u1?"not null":"null") << '\n';
  std::cout << "u2: " << (u2?"not null":"null") << '\n';
  std::cout << "u3: " << (u3?"not null":"null") << '\n';
  std::cout << "u4: " << (u4?"not null":"null") << '\n';
  std::cout << "u5: " << (u5?"not null":"null") << '\n';
  std::cout << "u6: " << (u6?"not null":"null") << '\n';
  std::cout << "u7: " << (u7?"not null":"null") << '\n';
  std::cout << "u8: " << (u8?"not null":"null") << '\n';

  return 0;
}

它生成(我通過執行代碼驗證了它)以下結果:

u1:null
u2:null
u3:不是 null
u4:不是 null
u5:null
u6:null
u7:不是 null
u8:不是 null

我很難理解的是:

  • 為什么u4有效而u5無效( nullptr )?
  • 為什么u7有效但u6無效?

也許這些問題是非常基本的,但我完全沒有抓住重點。

如果有人能就這些問題啟發我,我將不勝感激。

std::move被命名為move是有原因的。 當您從一個std::unique_ptr移動到另一個時,您從中移動的那個變為 nullptr。 不可能有任何其他方式,畢竟它是一個唯一的ptr,共享相同數據的兩個unique_ptr實例會違反這一點。 (同時離開 scope 都會調用刪除器兩次,然后一切都松了。)

為什么 u4 有效而 u5 無效(nullptr)?

因為u5u6的初始化中被移出,而u4尚未被移出。 移動構造函數保證將移動的指針設置為 null。 它不能指向與u6相同的 object,因為這會違反唯一性約束。

為什么 u7 有效但 u6 無效?

同樣的原因。

移動唯一擁有的 object 意味着新所有者擁有它,而前所有者則一無所有。
就像物理對象在現實世界中的工作方式一樣。

所有者轉換為 null 指針表示什么都沒有。

最初由u5擁有的 object 已先移至u6 ,然后移至u7

暫無
暫無

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

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