簡體   English   中英

C ++復制構造函數和指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM