一個空類有六個缺省函數,分別爲構造、析構、拷貝、賦值、取址、帶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);
}
}
}
程序變成了深拷貝。
調試君出場~~~
在深拷貝的情況下,此時的地址是不同的。
總結來說就是,在有指針的情況下,淺拷貝只是增加了一個指針指向已經存在的內存,而深拷貝就是增加一個指針並且申請一個新的內存,使這個增加的指針指向這個新的內存,採用深拷貝的情況下,釋放內存的時候就不會出現在淺拷貝時重複釋放同一內存的錯誤!