深拷貝/淺拷貝

  一個空類有六個缺省函數,分別爲構造、析構、拷貝、賦值、取址、帶const的取址函數。

  類的缺省賦值函數就是淺拷貝。

#include "stdafx.h"
#include "MyString1.h"

int main(int argc, char* argv[])
{
	CMyString m("Test~");
	CMyString m1 = m;

	return 0;
}

  當我運行時程序就會崩潰。。。

  開啓調試模式QAQ
  

 可以看到,淺拷貝就是直接拷貝了地址,可是一旦地址所對應內容發生了變化,而你卻不知道,那麼程序就會呵呵噠。

  下面給你們邊看邊解釋:

  當程序運行到最後的時候就會調用析構函數,第一次調用完析構函數的時候然後就會這樣

  當第二次調用的時候就會崩潰,因爲兩次delete了指向同一地址的指針。

  那麼接下來就說深拷貝:
    深拷貝是將該地址所存的內容拷貝過去,所以是不同的兩個地址,當釋放的時候就不存在上面的情況。
  我在類中增加了帶參構造函數,如下:
  
CMyString::CMyString(CMyString &m)
{
	if(this != &m)
	{
		if(NULL != m.m_pStr)
		{
			StrCopy(m.m_pStr);
		}
	}
}
  程序變成了深拷貝。
  調試君出場~~~


  在深拷貝的情況下,此時的地址是不同的。

  總結來說就是在有指針的情況下,淺拷貝只是增加了一個指針指向已經存在的內存,而深拷貝就是增加一個指針並且申請一個新的內存,使這個增加的指針指向這個新的內存,採用深拷貝的情況下,釋放內存的時候就不會出現在淺拷貝時重複釋放同一內存的錯誤!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章