簡單的來說就是,在有指標的情況下,淺複製只是增加了一個指標指向已經存在的記憶體,而深複製就是增加一個指標並且申請一個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深複製的情況下,釋放記憶體的時候就不會出現在淺複製時重複釋放同一記憶體的錯誤!
我列舉一個例子來說吧:
你正在編寫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;
這樣你就實現了深複製,原因是你為被賦值物件申請了一個新的記憶體所以就是深複製。
簡單的來說就是,在有指標的情況下,淺複製只是增加了一個指標指向已經存在的記憶體,而深複製就是增加一個指標並且申請一個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深複製的情況下,釋放記憶體的時候就不會出現在淺複製時重複釋放同一記憶體的錯誤!
我列舉一個例子來說吧:
你正在編寫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;
}
這樣你就實現了深複製,原因是你為被賦值物件申請了一個新的記憶體所以就是深複製。