C++淺拷貝和深拷貝
阿新 • • 發佈:2018-12-22
C++系統提供的拷貝建構函式是淺拷貝,只是簡單的值拷貝
#include<iostream> using namespace std; class Test { public: int m_a; char *name; public: Test(const char *s,int n) { m_a = n; name = (char *)malloc(strlen(s) + 1); strcpy(name, s); } ~Test() { free(name); name = NULL; } }; int main() { Test p1("我愛羅", 12); Test p2 = p1; //會呼叫系統預設的拷貝建構函式,這是一個淺拷貝 //由於是淺拷貝,類屬性裡面有指標,然後這個類的解構函式裡就會重複釋放同一塊記憶體空間兩次,導致程式出現錯誤 return 0; }
這段程式碼會報錯,是由於淺拷貝導致解構函式二次釋放同一塊記憶體空間導致
所以,當類裡面有指標屬性,且需要使用拷貝建構函式時,我們應該自己寫一個拷貝建構函式,現在對以上程式碼進行修改(自己新增一個深拷貝建構函式)
#include<iostream> using namespace std; class Test { public: int m_a; char *name; public: Test(const char *s,int n) { m_a = n; name = (char *)malloc(strlen(s) + 1); strcpy(name, s); } Test(const Test& t) //自己寫一個深拷貝建構函式 { m_a = t.m_a; name = (char *)malloc(strlen(t.name) + 1); strcpy(name, t.name); } ~Test() { free(name); name = NULL; } }; int main() { Test p1("我愛羅", 12); Test p2 = p1; return 0; }