所謂淺拷貝,指的是在物件複製時,只是對物件中的資料成員進行簡單的複製,預設拷貝建構函式執行的也是淺拷貝。簡單的說,淺拷貝就是值傳遞,將源空間裡面的內容複製到目標空間中。
存在缺陷:多個指標可能共用管理一塊記憶體空間,在釋放時,導致對一塊空間的多次釋放,造成記憶體洩露。
在「深拷貝」的情況下,對於物件中動態成員,就不能僅僅簡單地賦值了,而應該重新動態分配空間。
用深動形象的語言來說,如果把拷貝看作下面這幅圖,那麼,淺拷貝只能拷走美人魚的頭,水下部分它將無法操作,而深拷貝 不僅可以拷走頭,還可以操作水下隱含的部分。
好了,說到這裡,咱們可能對深淺拷貝或多或少的有了一些認識,那麼,下面,我們將實現乙個string 類,來更加具體權威的解釋深淺建構函式。
#includeusing namespace std;
class string
else
}string(const string& s)//拷貝建構函式
:_pstr(s._pstr)
string& operator=(const string& s)//賦值運算子過載
return *this;
}~string ()//析構函式
}private:
char* _pstr;
};void funtest()
int main ()
該例證明了淺拷貝會存在多個物件共用同一塊空間,在呼叫析構函式銷毀空間時,會出現對一塊空間多次釋放的情況,導致記憶體崩潰
#includeusing namespace std;
class string
else
}//拷貝建構函式********************************************
string(const string& s)
:_pstr(null)//選擇最佳
//賦值 運算子過載******************************************
//方式一:
string& operator=(const string& s)
return *this;
}//方式二:
//string& operator=(const string& s)
//
//方式三:
//string& operator=( string s)
////三種賦值運算子過載解決方案, 第一種方式為最優方案
//析構函式*****************************************
~string ()
}private:
char* _pstr;
int _count;
};void funtest()
int main ()
a.什麼是引用計數?
在開闢空間時,為了記錄該空間有多少物件在共用它,也就是說有多少指標指向它,採用再開闢乙個空間的方式,記錄該空間被指向的次數,這種方式被稱為引用計數。
b.用引用計數實現string時,引用計數可以普通的成員變數?為什麼?
解析:引用計數不可以為普通的成員變數,因為一旦出了作用域,該空間被銷毀,達不到想要的效果
c.用引用計數實現string時,引用計數可以類的靜態成員變數嗎? 為什麼?
解析:類的靜態成員變數,但在需要另外開闢空間時,採用這種方式就
#includeusing namespace std;
class string
else
_count=1;
}string (const string& s)
:_pstr(s._pstr)
~string ()
}private:
char* _pstr;
static int _count;
};int string:: _count=0;
void funtest()
int main()
為了在釋放的時候,防止忘記釋放引用計數所開闢的空間,所以盡量採用new [ ]
的方式來開闢空間,與delete[ ]搭配使用。
//************引用計數*******************************
#includeusing namespace std;
class string
else
}string (const string& s)
:_pstr(s._pstr)
,_pcount(s._pcount)
string& operator=(const string& s)
_pstr =s._pstr;
_pcount=s._pcount;
++_pcount;
}return *this;
}~string ()
}private:
char* _pstr;
int* _pcount;
};void funtest()
int main()
(cow不是奶牛)
//****寫時拷貝:如果要朝當前物件寫東西,最好使用這種方式*********
//單執行緒不會有問題
#includeusing namespace std;
class string
else
getraf()=1;
}string (const string& s)
:_pstr(s._pstr)
string& operator=(const string& s)
return *this;
}~string ()
char& operator (size_t index)
return _pstr[index];
}const char& operator (size_t index)const
private:
int& getraf()
void release()
}private:
char* _pstr;
};void funtest()
int main()
下面,在這裡提出兩點關於string類來說非常重要點:
一.熟悉庫中string類的每個介面,查文件,熟悉庫中的string類。
二.調研vs和linux系統下string類的結構,他們是否採用用深拷貝原理實現。
實現淺拷貝與深拷貝
js包含基本資料型別與引用資料型別兩種不同的資料型別的值,深拷貝與淺拷貝的概念只存在於引用資料型別。對於引用型別,淺拷貝是拷貝了指向這個物件堆記憶體的指標,是拷貝了對原物件引用,深拷貝是拷貝了該物件的所有屬性到乙個新的物件,若是原物件的某屬性依然引用了其他物件,那麼需要將原物件引用的其他物件一併進行...
C 深拷貝 與 淺拷貝
最近在寫一些c 程式,遇到個問題,記憶體會出錯,查了一些材料,終於發現問題所在了,原來碰到了傳說中的深拷貝和淺拷貝問題了,檢視一些材料,現在對這個問題做個總結 在類定義中,預設是淺拷貝,即 位拷貝 用在基本類中或者一些沒有指標的自定義型別中沒有一點問題,但是當遇到含有指標變數的自定義型別的時候,就會...
C 淺拷貝與深拷貝
淺拷貝 shallow copy 指的是當物件的字段被拷貝的時候,字段應用的物件不會被拷貝。深拷貝是對物件例項當中的字段引用的物件也進行拷貝的一種方式。淺拷貝可以通過將類實現介面icloneable class myclass icloneable 舉個簡單的例項 using system usin...