條款14 在資源管理類中小心copying行為

2021-10-01 19:07:00 字數 745 閱讀 8867

條款13裡講了兩種智慧型指標物件,它們都是用於管理動態記憶體的。然而,它們並不適用於管理別的資源,比如說互斥器。因此,有些時候我們需要自定義自己的資源管理類。

copying包括:copy 建構函式、copy賦值符號函式。在自定義資源管理類時,結合不同的問題(不同場景),處理copying 函式可能採取下述方案

(1)禁止複製

有些資源管理物件的copying是不合理的,或者說是沒意義的。比如:互斥器。

禁止複製的具體做法:將copying函式宣告為private的。(條款6)

(2)採用類似於trl::shared_ptr 的引用計數法

這裡的機制類似於trl::shared_ptr ,即直到指向同一物件的最後乙個智慧型指標物件被銷毀時前,才釋放資源。

具體做法:內含乙個成員變數,當其為0時,進行釋放資源。然而不同的資源,釋放資源的具體操作可能是不同的。例如,資源是記憶體的話,就應該是**記憶體。而資源是互斥器的話,釋放資源就應該是解除鎖定。

trl::shared_ptr智慧型指標,在預設引數情況下,便是**記憶體。但是,它也可以指定別的釋放資源的操作(被稱為"刪除器"),刪除器可以是乙個函式,也可以是乙個函式物件當需要它時,它可以作為trl::shared_ptr智慧型指標的第二個引數傳遞過去。

(3)複製底部資源

即,需要做到深拷貝。只要保證副本時,資源被**即可。

(4)轉移底部資源擁有權

類似於auto_ptr,即在執行copying操作時,使得等號右邊指向null,等號左邊指向原本的資源。

條款14 在資源管理類中小心copying行為

結論1 複製raii物件必須一併複製它所管理的資源,所以資源的copying行為決定raii物件的copying行為。結論2 普遍而常見的raii class copying行為是 1 抑制copying,即禁止複製 很多時候允許raii物件被複製是不合理的。2 對底層資源施行引用計數法 在此情況下...

條款14 在資源管理類中小心copying行為

總結 條款13介紹了作為資源管理類支柱的 resource acquisition isinitialization raii 原則,並描述了 auto ptr 和 tr1 shared ptr 在基於堆的資源上運用這一原則的表現。然而,並非所有的資源都是基於堆的,對於這樣的資源,像 auto pt...

條款14 在資源管理類中小心copying行為

條款14 在資源管理類中小心copy行為 1.複製raii物件必須一併複製它所管理的資源,所以資源的copying行為決定raii物件的copying行為。2.普遍而常見的raii class copying行為是 抑制copying 施行引用計數法 reference counting 不過其他行...