上節課引用技術遺留了兩個問題
當我們資源進行修改, 所有引用該物件的資源都會被修改.
解決該問題的思路:寫時拷貝(copy on write) : 在寫的時候, 對資源進行重新拷貝乙份, 當某個資源要進行修改的時候, 我們c++檢測到這種修改, 然後會對這個資源進行一次拷貝, 接下來你的修改與原資源沒有關係了, 因為你改變的是拷貝的值, 所以如果這麼做, 能夠解決上述問題
但是如果這麼做, 要對引用技術進行相應的加減, 新的資源, 要有新的引用計數器, 要新產生,並且變為1; 原始的資源的引用計數要-1, 所以要涉及到兩個事情
1.1. 資源的拷貝
1.2. 引用計數器的加減
分析**:
//#include
"stdafx.h"
#include
#include
struct refvalue
;refvalue::
refvalue
(const
char
* pszname)
refvalue::
~refvalue()
}void refvalue::
addref()
void refvalue::
release()
}class
cstudent
}private
: refvalue* m_pvalue;};
void cstudent::
setname
(const
char
* pszname)
cstudent::
cstudent
(const
char
* pszname)
cstudent::
cstudent
(cstudent& obj)
cstudent::
~cstudent()
cstudent& cstudent::
operator
=(cstudent& obj)
m_pvalue-
>
release()
; m_pvalue = obj.m_pvalue;
m_pvalue-
>
addref()
;return
*this;}
void cstudent::
release()
intmain
(int argc,
char
* ar**)
還是一樣的道理, 建立乙個計數器物件struct refvalue
然後資源和計數器繫結
struct refvalue
計數器是普通的變數int
, 因為refvalue
是指標
接著計數器建立物件, 計數器賦值為1
refvalue::
refvalue
(const
char
* pszname)
釋放的時候釋放掉
refvalue::
~refvalue()
}
該+1的+1
該釋放的釋放
void refvalue::
addref()
void refvalue::
release()
}
與上一次**唯一改變的地方 =運算子的過載cstudent& operator=(cstudent& obj);
以及拷貝構造cstudent(cstudent& obj);
當進行拷貝構造的時候, 用的是淺拷貝, 並且資源計數器+1
cstudent::
cstudent
(cstudent& obj)
當進行=運算子過載的時候, 依然是淺拷貝, 資源計數器 + 1
cstudent& cstudent::
operator
=(cstudent& obj)
m_pvalue-
>
release()
; m_pvalue = obj.m_pvalue;
m_pvalue-
>
addref()
;return
*this
;}
但是在修改資源的時候void setname(const char* pszname);
會對原來的計數器進行釋放m_pvalue->release();
void refvalue::
release()
}
然後就會建立新的計數器, 賦給當前的物件m_pvalue = new refvalue(pszname);
核心**
void cstudent::
setname
(const
char
* pszname)
執行**:
此時stu2
和stu3
同時在使用「li si」
這個資源, 所以引用計數為2次, 兩者的m_pszname
是一模一樣的
如果呼叫setname
, 會對其中乙個資源(m_pszname
)進行修改
要修改資源了, 對原有資源的引用計數器進行釋放操作
進行原有資源釋放操作, 需要判斷原有資源引用計數
新建立乙個物件(**中"li si2"
) 的引用計數器賦給當前引用計數器
計數器變為1
最後的結果
本來兩者擁有的是同一種資源, 但是其中某乙個資源得到了修改, 就會重新申請乙份資源, 對新申請的資源進行修改, 就是寫時拷貝操作
react16的新特性
react 16 的好處 1 新的核心演算法 fiber react 新的演算法,更加友好 2 render可以return陣列 字串 可以return陣列 不需要包div 但是必須有對應的key 3 錯誤處理機制 增加了拋異常的生命週期函式 componentdidcatch err,info 這...
C 函式新特性
1.函式的預設引數 函式可以有預設引數,你在呼叫的時候,如果不給函式引數賦值,函式將按照預設值執行 2.過載函式 函式可以過載,也就是函式名稱可以一樣,只是返回型別以及引數型別,數目不同。函式被呼叫的時候,系統會根據引數來匹配到相應的函式。3.內聯函式 申明時候加上inline,省去了函式傳遞的過程...
從C 2 0新特性到C 3 5新特性
一 c 2.0 新特性 1 泛型 listobj list new list obj list.add new myobject 2 部分類 partial namespace set 或在另乙個檔案中 public partial class class1 3 靜態類 public static ...