C STL 之 容器的深拷貝和淺拷貝

2022-06-02 18:09:18 字數 918 閱讀 5862

如果我們沒有提供拷貝建構函式,沒有過載=操作符,vector 對我們的 mc 物件進行的簡單的淺拷貝,將拷貝的物件插入到容器中,導致我們的 mc 物件的 data 指標和容器中mc 物件的拷貝物件中的 data 指標都指向了我們在堆區分配的記憶體,當函式結束,兩個物件都呼叫了析構函式,先呼叫析構函式的物件成功釋放了堆區記憶體,後呼叫析構函式的物件一釋放,程式掛掉了。

原因在於兩個指標指向了同一塊堆區記憶體,這樣會導致不可預知的結果,函式結束其中乙個呼叫析構函式,銷毀了 data 指向的記憶體空間,而另乙個物件析構的時候就會掛掉。

問題的解決辦法就是,給我們的物件提供乙個拷貝建構函式,並且過載=操作符,兩個指標分別指向自己的那一塊記憶體,互不影響。

#include #include 

using

namespace

std;

class

person

//增加拷貝建構函式

person(const person&p)

//過載 operator=操作符

person& operator=(person&p)

this->pname = new

char[strlen(p.pname) + 1

]; strcpy_s(

this->pname, strlen(p.pname) + 1

, p.pname);

this->mage =p.mage;

return *this

; }

~person()

}public

:

char* pname; //

指標容易淺拷貝的問題

intmage;

};void

test01()

intmain()

C 容器之淺拷貝與深拷貝

二 深拷貝 淺拷貝不開闢新空間,只增加乙個指標,指向原有的記憶體。析構函式 person private char mname 指標 容易淺拷貝的問題 int mage void test01 intmain void 程式執行出錯 因為,發生了淺拷貝,p 和 vperson兩個物件指標指向同一塊記...

關於容器 列表的深拷貝和淺拷貝

深拷貝 python3 import copy l 3.1,3.2 l1 1,2,l l2 copy.deepcopy 深拷貝 l 0 3.14 print l1 1,2 3.14,3.2 print l2 1,2,3.1,3.2 淺拷貝 python3 l 3.1,3.2 l1 1,2,l l2 ...

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...