簡體   English   中英

智能指針概念所有權和生命周期

[英]Smart pointer concepts ownership and lifetime

在使用 C++ 智能指針(唯一、共享、弱)時,有兩個概念(所有權、生命周期)很重要。 我試圖理解這些概念以及它們如何影響智能指針(或原始指針)的使用。

我讀了兩條規則:

  1. 始終使用智能指針來管理動態對象的所有權/生命周期。
  2. 在不管理所有權/生命周期時不要使用智能指針。

一個例子:

class Object
{
   public:
      Object* child(int i) { return mChildren[i]; }
      // More search and access functions returning pointers here

   private:
      vector<Object*> mChildren;
};

我想使用智能指針重寫它。 讓我們先忽略 child()。 輕松的游戲。 父母擁有其子女。 所以讓 mChildren 成為 unique_ptr 的向量。

根據上述規則,有些人認為 child(i) 應該繼續返回原始指針。

但這不是有風險嗎? 有人可能會做一些愚蠢的事情,例如刪除返回的對象會導致難以調試的崩潰……使用weak_ptr 或shared_ptr 作為返回值可以避免這種情況。

難道不能說復制指針總是意味着暫時共享所有權和/或斷言對象的生命周期嗎?

僅當我也沒有獲得更安全的 API 時,才值得為兒童使用智能指針嗎?

您可以返回一個const std::unique_ptr<Object>& ,這將允許您具有原始指針的相同語義以在防止刪除的同時調用其上的方法。

當您知道所有權將保留任何原始指針並且您確定人們不會嘗試直接delete指針時,將std::unique_ptr與原始指針一起使用是有意義的。 所以這與使用std::weak_ptrstd::shared_ptr因為它們根本不允許您使用懸空指針。

總是有犯錯的空間,所以答案實際上取決於具體情況,該代碼將在何處使用等等。

暫無
暫無

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

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