回覆列表
-
1 # 細講故事
-
2 # 使用者6511048512836
簡單的來說就是,在有指標的情況下,淺複製只是增加了一個指標指向已經存在的記憶體,而深複製就是增加一個指標並且申請一個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深複製的情況下,釋放記憶體的時候就不會出現在淺複製時重複釋放同一記憶體的錯誤!
我列舉一個例子來說吧:
你正在編寫C++程式中有時用到,運算子的過載。最能體現深層複製與淺層複製的,就是‘=’的過載。
看下面一個簡單的程式:
class string
{
char *m_str;
public:
string(char *s)
{
m_str=s;
}
string()
{};
String & operator=(const string s)
{
m_str=s.m_str;
return *this
}
};
int main()
{
string s1("abc"),s2;
s2=s1;
cout
}
上面的 =過載其是就是實現了淺複製原因。是由於物件之中含有指標資料型別.s1,s2恰好指向同一各記憶體。所以是淺複製。而你如果修改一下原來的程式:
string&operator=(const string&s)
{
if(strlen(m_str)!=strlen(s.m_str))
m_str=new char[strlen(s.m_str)+1];
if(*this!=s)
strcopy(m_str,s.m_str);
return *this;
}
這樣你就實現了深複製,原因是你為被賦值物件申請了一個新的記憶體所以就是深複製。
深複製和淺複製: 淺複製就比如像引用型別,而深複製就比如值型別。 淺複製是指源物件與複製物件共用一份實體,僅僅是引用的變數不同(名稱不同)。對其中任何一個物件的改動都會影響另外一個物件。舉個例子,一個人一開始叫張三,後來改名叫李四了,可是還是同一個人,不管是張三缺胳膊少腿還是李四缺胳膊少腿,都是這個人倒黴。 深複製是指源物件與複製物件互相獨立,其中任何一個物件的改動都不會對另外一個物件造成影響。舉個例子,一個人名叫張三,後來用他克隆(假設法律允許)了另外一個人,叫李四,不管是張三缺胳膊少腿還是李四缺胳膊少腿都不會影響另外一個人。比較典型的就是Value(值)物件,如預定義型別Int32,Double,以及結構(struct),列舉(Enum)等。