2014-11-22 2 views
0

У меня есть класс «Маршрут», в котором хранится связанный список. Объекты класса «Маршрут» хранятся в векторах (а иногда и удаляются).C++ вектор объектов, содержащий динамически выделенную память - «erase» не работает

Без конструктора/деструктора копирования и т. Д. программа работает нормально, но я хочу избежать утечек памяти, поэтому мне нужен конструктор/деструктор копирования и т. д. После создания этих векторных «стираний», кажется, удаляет из вектора неправильные элементы (т. е. последний элемент, а не 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=, не имеет никакого смысла. Вы должны назначить состояние параметра текущему объекту. Вместо этого вы создаете новый объект и возвращаете ссылку на него.

Чтобы узнать подробности, попробуйте Google для «оператора присваивания» или «специальных функций-членов» или «правила из трех».

+0

Не говоря уже о том, что это приводит к бесконечной рекурсии. –

+0

Да, переписал перегруженный оператор присваивания - по какой-то причине я думал, что векторы используют только конструктор/деструктор копии. благодаря! – hassapikos

Смежные вопросы