C++ Primer 5th笔记(chap 13 拷贝控制)引用计数
生活随笔
收集整理的這篇文章主要介紹了
C++ Primer 5th笔记(chap 13 拷贝控制)引用计数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引用計數Reference Count
1. 問題
計數器存放在哪?作為類對象的成員時,遇到拷貝構造時如何處置?
Hasptr p1("Hiya"); Hasptr p2(p1); Hasptr p3(p1); //p1,p2,p3指向相同的string2. 解決方法
每個類對象都有一個引用計數,所有類對象的引用計數保證唯一同步。
class Hasptr { public://2. 當創建一個對象時,只有一個對象共享狀態,將此計數器初始化為1。Hasptr(const std::string &s = std::string()):ps(new std::string(s),i(0),use(new std::size_t(1))) {}//3. 拷貝構造函數遞增共享的計數器,指出給定對象的狀態又被一個新的用戶所共享。Hasptr(const Hasptr &p):ps(p.ps),i(p.i),use(p.use){++*use}; Hasptr& operator=(const Hasptr&);~Hasptr(); private:std::string *ps;int i;std::size_t *use;//1. 增加一個引用計數,用來記錄有多少對象與正在創建的對象共享狀態。 }2. 1 析構函數
析構函數遞減計數器,指出共享狀態的用戶少了一個,如果計數器為0,則析構函數釋放狀態。
Hasptr ::~Hasptr() {if(--*use == 0){delete ps;delete use;} }2. 2 重載賦值
拷貝賦值運算符遞增右側運算對象的計數器,遞減左側運算對象的計數器。如果左側運算對象的計數器為0,意味著它的共享狀態沒有用戶了,拷貝賦值運算符就必須銷毀狀態。
Hasptr& Hasptr::operator=(const Hasptr& rhs) {++*rhs.use; //遞增右側對象的引用計數if(--*use == 0) //遞減和檢測本對象的引用計數{delete ps;delete use;}ps = rhs.ps;i = rhs.i;use = rhs.use;return *this; }3. result
HasPtr h("hi mom!"); HasPtr h2 = h; // no new memory is allocated, // h and h2 share the same underlying string HasPtr ret; ret = h; // HasPtr passed by value, so it is copied cout << ret.i << "," << *ret.ps << endl;
【參考】
[1] 代碼referenceCount.h
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 13 拷贝控制)引用计数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha