2014-11-22 45 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