簡體   English   中英

使用智能指針時是否有必要阻塞賦值運算符和復制構造函數?

[英]Is it necessary to block the assignment operator and the copy constructor when using smart pointers?

我在很多地方都看到過建議,要么定義自己的賦值運算符/副本構造函數,要么通過將默認值聲明為私有來阻止默認值。

但是,我唯一發現的危險是創建指針副本的問題,該副本以后可能會懸空指針。

在現代C ++指針中很少見,大多數類僅使用智能指針(例如,來自boost或來自C ++ 11中的std庫)。 對於沒有原始指針的類,仍然需要聲明賦值運算符和復制構造函數嗎?

主要是:不這樣做的危險是什么? 會發生什么樣的意外行為?

不必隱藏那些運算符。 std::unique_ptr已經是不可復制(你只能移動)。 其他類型std::shared_ptr會增加內部引用計數, std::weak_ptr不會執行任何操作,因為它具有lock方法。 您可以在這里閱讀更多內容(增強庫)

在“ 什么是三法則 ”問題中對此進行了解釋

在以下網站上也有很好的解釋:

我可以信任編譯器生成的副本構造函數和賦值運算符嗎?

編譯器生成的代碼是您最好的朋友,只要您遵守良好的OO風格慣例並了解規則。 如第I部分所述,編譯器生成的復制構造函數和賦值運算符對用戶聲明的數據成員執行逐成員復制。 通過將低級數據類型(例如,原始指針和char數組)替換為其對應的高級標准庫std :: tr1 :: shared_ptr和std :: string,不僅可以消除與手動資源相關的繁瑣錯誤在管理方面,您還保證了編譯器生成的副本構造函數和賦值運算符將做正確的事情。

不定義自己的賦值運算符/復制/移動構造函數的危險是可能發生意外行為。 這些操作很容易被調用,而無需您意識到,從而導致意外的行為。 在這種情況下,將它們聲明為私有將導致編譯錯誤。

另請注意,並非在所有地方都使用智能指針。 還有更多受限制的環境(例如內核,嵌入式等),這些環境通常沒有STL或boost。

暫無
暫無

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

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