2014-11-22 47 views
0

我創建了一個存儲鏈接列表的類'Route'。 'Route'類的對象存儲在向量中(有時會被刪除)。C++向量對象,包含動態分配的內存 - '擦除'不起作用

沒有複製構造函數/析構函數/ etc。該程序工作正常,但我想避免內存泄漏,所以我需要一個副本構造/析構函數等。自創建這些,向量'擦除'似乎刪除向量中的錯誤元素(即最後一個元素,而不是第n個元件)。有時元素會從矢量中刪除,即使沒有任何元素應該被刪除。我的構造函數/析構函數/拷貝構造函數有什麼問題嗎? (每次複製一個Route對象,將其放到一個向量上時,將使用新的內存 - 使用'copyLinkedList'函數創建一個全新的鏈接列表版本。

`Route::Route(int destnAddr, MovePtr routeToDestn) : 
    destinationAddress(destnAddr){ 
    firstMove = copyLinkedList(routeToDestn); 
} 

Route::Route(const Route& _route){ 
    destinationAddress = _route.destinationAddress; 
    firstMove = copyLinkedList(_route.firstMove); 
} 

Route& Route::operator=(const Route& _route){ 
    Route newRoute(_route); 
    return newRoute; 
} 

Route::~Route(){ 
    MovePtr toDelete = firstMove; 
    while(firstMove != NULL){ 
    firstMove = firstMove->next_move; 
    delete toDelete; 
    toDelete = firstMove; 
    } 
} 

MovePtr Route::copyLinkedList(MovePtr listHead) { 
    MovePtr newListHead = NULL; 

    if (listHead == NULL){ 
     return newListHead; 
    } 

    newListHead = new Move; 
    newListHead->router_address = listHead->router_address; 
    newListHead->next_move = copyLinkedList(listHead->next_move); 
    return newListHead; 
}` 

回答

1

你在operator=中所做的沒有任何意義。您應該將參數的狀態分配給當前對象。相反,你創建一個新的對象並返回一個懸而未決的引用。

嘗試谷歌的「轉讓運營商」或「特殊成員功能」或「三規則」的細節。

+0

更不用說這會導致無限遞歸。 – 2014-11-22 14:19:07

+0

是的,重寫重載賦值操作符工作 - 出於某種原因,我曾經以爲矢量只使用拷貝構造函數/析構函數。謝謝! – hassapikos 2014-11-22 15:08:33