C++淺拷貝和深拷貝的區別

來源:互聯網
上載者:User

標籤:

c++預設的拷貝建構函式是淺拷貝

淺拷貝就是對象的資料成員之間的簡單賦值,如你設計了一個沒有類而沒有提供它的複製建構函式,當用該類的一個對象去給令一個對象賦值時所執行的過程就是淺拷貝,如:
class A { public: A(int _data) : data(_data){} A(){}
private: int data; };
int main() { A a(5), b = a; // 僅僅是資料成員之間的賦值 }
這一句b = a;就是淺拷貝,執行完這句後b.data = 5;
如果對象中沒有其他的資源(如:堆,檔案,系統資源等),則深拷貝和淺拷貝沒有什麼區別,但當對象中有這些資源時,例子:
class A { public: A(int _size) : size(_size){data = new int[size];} // 假如其中有一段動態分配的記憶體 A(){}; ~A(){delete [] data;} // 析構時釋放資源
private: int* data; int size; }
int main() { A a(5), b = a; // 注意這一句 }
這裡的b = a會造成未定義行為,因為類A中的複製建構函式是編譯器產生的,所以b = a執行的是一個淺拷貝過程。我說過淺拷貝是對象資料之間的簡單賦值,比如:
b.size = a.size; b.data = a.data; // Oops!
這裡b的指標data和a的指標指向了堆上的同一塊記憶體,a和b析構時,b先把其data指向的動態分配的記憶體釋放了一次,而後a析構時又將這塊已經被釋放過的記憶體再釋放一次。
對同一塊動態記憶體執行2次以上釋放的結果是未定義的,所以這將導致記憶體泄露或程式崩潰。
所以這裡就需要深拷貝來解決這個問題,深拷貝指的就是當拷貝對象中有對其他資源(如堆、檔案、系統等)的引用時(引用可以是指標或引用)時,對象的另開闢一塊新的資源,而不再對拷貝對象中有對其他資源的引用的指標或引用進行單純的賦值。如:
class A { public: A(int _size) : size(_size){data = new int[size];} // 假如其中有一段動態分配的記憶體 A(){}; A(const A& _A) : size(_A.size){data = new int[size];} // 深拷貝 ~A(){delete [] data;} // 析構時釋放資源
private: int* data; int size; }
int main() { A a(5), b = a; // 這次就沒問題了 }
總結:
深拷貝和淺拷貝的區別是在對象狀態中包含其它對象的引用的時候,當拷貝一個對象時,如果需要拷貝這個對象引用的對象,則是深拷貝,否則是淺拷貝。

轉!http://blog.csdn.net/daofengdeba/article/details/7866534

C++淺拷貝和深拷貝的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.