深拷貝 淺拷貝 引發的寫時拷貝

2021-08-21 17:46:47 字數 1523 閱讀 1159

從乙個例子說明淺拷貝是什麼

#include using namespace std;

class string

else

}~string()

private:

char *data;

};

當類中的私有資料  有指標  並且如果讓程式預設生成 拷貝構造和 賦值方法   會發生淺拷貝現象 ,即

void main()

預設的拷貝構造 只拷貝指標的指向,就是 s1和s2現在都指向同一塊存著?「hello」的位址空間。

當析構的時候,先析構s1,之後再析構s2會發現這塊記憶體已經被釋放了,故淺拷貝造成非法的位址訪問。

解決方法是自己寫拷貝構造和賦值方法。

string(const string &str)

string& operator=(const string &str)

return *this;

}

自己實現的方法,就是先申請一塊記憶體,進行拷貝,拷貝指標指向的值到新空間。

但是這種深拷貝會造成多塊記憶體存的資料都是一樣的,出現浪費記憶體的現象。

於是使用寫時拷貝技術。

寫時拷貝技術指的是,當在拷貝構造和賦值的時候,如果物件只是進行讀操作,那麼採用淺拷貝,多個物件共用一塊記憶體,

當物件需要對記憶體進行寫操作時,立即使用深拷貝,另開闢新記憶體,拷貝記憶體上的資料,在新記憶體上進行寫操作。

#include #include using namespace std;

class string;

class string_rep//全部實現深拷貝 實現乙個引用計數器

else

}string_rep(const string_rep &str) :count(0) //需要初始化 引用計數器

string_rep& operator=(const string_rep &str)

return *this;

} ~string_rep()

public:

void plus()

void dec() }

char& write(int n) //為了過載

private:

char *data;

int count;

};class string

string(const string &str)

string& operator =(const string &str)

return *this;

} char& operator (int pos) //過載 此時需要寫 需要更改了 使用深拷貝

return rep->write(pos);

} ~string()

private:

string_rep *rep;

};void main()

淺拷貝,深拷貝,寫時拷貝

淺拷貝 拷貝構造時複製指標僅僅是對指標的值拷貝,而不開闢新的空間這樣就會造成在析構的時候。會對同一塊記憶體釋放兩次。深拷貝 拷貝構造時會開闢新的記憶體,並把記憶體中的值進行拷貝 寫時拷貝 就是當你在讀取一片空間時,系統並不會為你開闢乙個一模一樣的空間給你 只有在當你真正修改的時候,才會開闢一片空間給...

深拷貝 淺拷貝 寫時拷貝

在拷貝構造的時候,直接將原內容的位址交給要拷貝的類,兩個類共同指向一塊記憶體。缺陷 1 一旦對str2進行操作,str1的內容也會改變 2 析構時先析構str2,再析構str1,但是由於str1,str2指向同一塊記憶體空間,因此會導致對一塊記憶體進行兩次析構而出現錯誤 通過開闢和源空間大小相同的記...

淺拷貝,深拷貝,寫時拷貝

思想 我們用指標p申請了一塊記憶體空間,在用指標q指向了這一片記憶體空間,這時候這兩個指標指向的是同乙個記憶體空間,當需要釋放這塊記憶體空間的時候p會釋放一次,q也會釋放一次,這樣重複釋放就會引發程式的崩潰。我們通過一段 來理解淺拷貝 class person void test int main ...