事情的經過是這樣的,我在實現乙個基於opencv的cimage類。我需要實現它的拷貝建構函式,因為我要把它push_back到vector裡面去。我過去的一直做法是在賦值操作符中實現真正的操作,在拷貝建構函式中呼叫。但是在這裡卻出現了記憶體錯誤。
好歹我還寫過幾年程式,那我就開始了艱辛的除錯。經過除錯我發現,我的程式一直只進入拷貝建構函式,然後進去賦值操作符,在賦值操作符中我釋放了物件原有的記憶體。錯誤就出現在了這裡。按照我這種寫法的理解,push_back是先用預設建構函式構造物件加入vector,然後再用原有拷貝建構函式初始化內容,或者說用賦值操作符初始化內容。
事實上,完全不是這樣的。push_back直接新增新的記憶體,然後對這塊新的記憶體用拷貝建構函式初始化而已。既然這樣的話,拷貝建構函式是不能夠直接呼叫賦值操作符的。應該再重新寫乙個真正的賦值子函式,拷貝建構函式和賦值操作符都呼叫這個子函式。賦值操作符中多了乙個先檢查是否同乙個物件,如果不是同乙個則釋放原有記憶體的過程而已。
具體的可以看,cimage的部分**。
class cimage
;
cimage::cimage(void)
cimage::cimage(const char* pcszname)
cimage::~cimage(void)
void cimage::copydata(const cimage& yximage)
}cimage::cimage(const cimage& yximage)//複製建構函式
cimage& cimage::operator=(const cimage& yximage)
uninit();
copydata(yximage);
return *this;
}
對於拷貝建構函式和賦值建構函式的理解
昨天晚上在看智慧型指標的時候,我發現自己連乙個拷貝建構函式和賦值建構函式都寫不出來,自己就嘗試寫了乙個版本,結果發現錯誤百出,對於拷貝建構函式和賦值建構函式的理解僅僅停留在理論的方面,而不知其中太多的內涵。比如我們都知道拷貝建構函式和賦值建構函式最大的不同在於 拷貝構造是確確實實構造乙個新的物件,並...
對於拷貝建構函式和賦值建構函式的理解
昨天晚上在看智慧型指標的時候,我發現自己連乙個拷貝建構函式和賦值建構函式都寫不出來,自己就嘗試寫了乙個版本,結果發現錯誤百出,對於拷貝建構函式和賦值建構函式的理解僅僅停留在理論的方面,而不知其中太多的內涵。比如我們都知道拷貝建構函式和賦值建構函式最大的不同在於 拷貝構造是確確實實構造乙個新的物件,並...
對於拷貝建構函式和賦值建構函式的理解
昨天晚上在看智慧型指標的時候,我發現自己連乙個拷貝建構函式和賦值建構函式都寫不出來,自己就嘗試寫了乙個版本,結果發現錯誤百出,對於拷貝建構函式和賦值建構函式的理解僅僅停留在理論的方面,而不知其中太多的內涵。比如我們都知道拷貝建構函式和賦值建構函式最大的不同在於 拷貝構造是確確實實構造乙個新的物件,並...