c 深入解析淺拷貝與深拷貝

2021-08-21 14:56:10 字數 2635 閱讀 3955

淺拷貝,也稱位拷貝,編譯器只是將物件中的值拷貝過來,如果物件中管理資源,最後就會導致多個物件共享同乙份資源,當乙個物件銷毀時就會將該資源釋放掉,而此時另一些物件不知道該資源已經被釋放,以為還有效,所以當繼續對資源進行操作時就會出現訪問違規

先看一段**

class string

~string()

string(const string& s)//深拷貝

:_pstr(new char[strlen(s._pstr)+1])//重新申請了一段空間

//賦值運算子過載

//方法一

//string& operator=(const string s)

// // return *this;//為了支援鏈式訪問

//}//方法二(優)

string& operator=(const string& s)

return *this;

} ~string() }

private:

char *_pstr;

};int main()

一般情況下,上面對賦值運算子過載的兩種寫法都可以,但是相對而言,第二種更優一點,對於第一種,先釋放了舊空間,但是如果下面用new開闢新空間時有可能失敗,丟擲異常而這時將s2賦值給s3,不僅沒有賦值成功,而且也破壞了原有的s3物件,對於第二種,先開闢新空間,將新空間賦給乙個臨時變數,就算這時空間開闢失敗,也不會影響原本s3物件

引用計數

當多個物件共享一塊資源時,要保證該資源只釋放一次,只需記錄有多少個物件在使用該資源即可,沒減少(增加)乙個物件使用,給該計數減一(加一),當最後乙個物件不使用時,該物件負責將資源釋放掉即可

class string

string(const char *str)

else

getcount(_str)=1;//將計數器初始值設為1

} string(const string& s)

:_str(s._str)

//s1=s2;

string operator=(const string& s)

return *this;

} ~string()

private:

int& getcount(char * str)

void release()

private:

char *_str;

};int main()

上面的**是在構造的時候多申請4位元組空間來儲存計數器,從而實現計數

但是這樣還是有問題,看下面的**

class string

string(const char *str)

else

getcount(_str)=1;//將計數器初始值設為1

} string(const string& s)

:_str(s._str)

//s1=s2;

string operator=(const string& s)

return *this;

} char& operator(size_t index)//可以用下標的方式來訪問string類

當共用同一塊空間的物件的任一物件修改字串中的值,則會導致所有共用這塊空間中的內容全被改變,我們只想改變s3的值,但是和它共用的兩個物件的值也全改變,這就引出了寫時拷貝

有多個物件共享同一空間時,當對其中乙個物件唯讀時,不會有什麼影響,但是想要改變某個物件的值時,這時就要為這個物件重新分配空間,**實現如下

class string

string(const char *str)

else

getcount()=1;//將計數器初始值設為1

} string(const string& s)

:_str(s._str)

//s1=s2;

string operator=(const string& s)

return *this;

} char& operator(size_t index)//可以用下標的方式來訪問string類

深入解析JS物件的淺拷貝與深拷貝

在js中有5種基本的資料型別 number boolean undefined null string,還有一種複雜的資料型別 object,基礎資料型別不存在深拷貝和淺拷貝的問題,只有object物件才會有這個煩惱。var a var b a 淺拷貝操作 a.age 26 console.info...

C 深拷貝 與 淺拷貝

最近在寫一些c 程式,遇到個問題,記憶體會出錯,查了一些材料,終於發現問題所在了,原來碰到了傳說中的深拷貝和淺拷貝問題了,檢視一些材料,現在對這個問題做個總結 在類定義中,預設是淺拷貝,即 位拷貝 用在基本類中或者一些沒有指標的自定義型別中沒有一點問題,但是當遇到含有指標變數的自定義型別的時候,就會...

C 淺拷貝與深拷貝

淺拷貝 shallow copy 指的是當物件的字段被拷貝的時候,字段應用的物件不會被拷貝。深拷貝是對物件例項當中的字段引用的物件也進行拷貝的一種方式。淺拷貝可以通過將類實現介面icloneable class myclass icloneable 舉個簡單的例項 using system usin...