一般來說,編譯器自帶的複製建構函式都為淺拷貝函式,由於只是執行乙個值傳遞指令,因此兩個或多個物件最終指向的是同乙個記憶體空間,從而在釋放記憶體時帶來錯誤
使用new關鍵字重新再堆區開闢新的記憶體拷貝變數並儲存在新的空間,因此會有兩個位址
案例:
#include
using
namespace std;
class
person
person
(int age,
int height)
~person()
//析構的作用之一就是如下的將記憶體釋放的過程
cout<<
"person 析構函式呼叫"
int*m_height;};
void
example()
intmain()
以上程式在編譯執行當中會報錯,因為如果使用編譯器自帶的複製建構函式,就會帶來淺拷貝的問題,如果在析構函式中釋放記憶體就會導致重複釋放發生錯誤。使用深拷貝就會在另外乙個變數儲存時使用新的位址,從而達到兩個使用的記憶體不同,避免重複釋放。
這時可以在析構函式上方新增如下**:
person
(const person &p)
C語言 淺拷貝與深拷貝
淺拷貝 表層的引用,實際指向同一塊記憶體 深拷貝 存放在不同的記憶體空間當中 typedef structstudent student stu1 student stu2 stu1.name kkk stu1.age 20 stu2 stu1 printf stu1 addr p,addr stu...
C 學習 深拷貝與淺拷貝
c 中在類中預設的拷貝函式 系統自動生成的 這就是淺拷貝。只是簡單的將成員內容複製。例如下面的 include include using namespace std class array array const array arr arrat using namespace std int ma...
學習記錄 js深拷貝 淺拷貝
js 的資料型別有兩種,一種是基本資料型別 string number boolean null undefined symbol 一種是引用資料型別 object array function 基本資料型別是放在棧記憶體的,而引用資料型別是存放在堆記憶體的,它會在棧記憶體裡面存放乙個指向堆記憶體的...