[英]c++ Copy constructor and pointer
我正在使用此類方法的Place
類:
class Place{
protected:
Keypoint* _kp;
Place() {
Keypoint* kp = new Keypoint();
_kp = kp;
};
Place(const Place& cSource){
delete _kp;
_kp = cSource.makePointer();
}
virtual ~Place(){
delete _kp;
}
virtual Keypoint* makePointer() const {
return _kp->makePointer();
}
};
因此,構造函數,析構函數和復制方法。
在我的主要工作中,我做了一些簡單的事情,例如AASS::graphmatch::Place ppp; AASS::graphmatch::Place p2(ppp);
AASS::graphmatch::Place ppp; AASS::graphmatch::Place p2(ppp);
嘗試復制構造函數,並且在valgrind中有一個很大的段錯誤,告訴我在復制中刪除后,我使用Conditional jump or move depends on uninitialised value(s)
。 makePointer
中的makePointer
方法執行一個new
並返回一個指針Keypoint*
。
virtual Keypoint* makePointer() const {
Keypoint* d = new Keypoint();
return d;
}
據我了解,應該使用delete釋放每個新對象,因此這就是為什么在調用makePointer
之前使用delete的原因。 所以這就是為什么我首先刪除_kp釋放舊的內存,然后為它分配新創建的指針。
我無法理解為什么我擁有未初始化的價值?
在副本構造函數中,您正在調用delete _kp;
。 但是_kp
尚未初始化。
那不會很好地結束。
刪除行delete _kp;
。 更好的是,考慮使用基本成員初始化 :
Place(const Place& cSource) : _kp(cSource.makePointer())
{
}
更好的是,考慮為Keypoint
成員使用托管指針類,如std::unique_ptr
。
您將復制構造函數編寫為好像是賦值運算符一樣:
Place(const Place& cSource){
delete _kp;
_kp = cSource.makePointer();
}
您可能需要一個賦值運算符,並且可能還需要一個復制構造函數。 但是它們不是同一回事。
_kp在進入復制構造函數時會保留垃圾,因此delete
是一個錯誤。
您在副本構造函數中刪除未初始化的指針:
Place(const Place& cSource){
// delete _kp; // _kp is not initialized
_kp = cSource.makePointer(); // now _kp gets initialized
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.