Pergunta

Estou tendo um problema com delete e destruidor (tenho certeza de que estou cometendo um erro estúpido aqui, mas ainda não consegui descobrir isso).

Quando eu entro no destruidor e tento chamar Excluir em um ponteiro, a mensagem aparece "não pode acessar a memória no endereço algum endereço."

O código relevante é:

/*
 * Removes the front item of the linked list and returns the value stored
 * in that node.
 *
 * TODO - Throws an exception if the list is empty
 */
std::string LinkedList::RemoveFront()
{
    LinkedListNode *n = pHead->GetNext(); // the node we are removing
    std::string rtnData = n->GetData(); // the data to return

    // un-hook the node from the linked list
    pHead->SetNext(n->GetNext());
    n->GetNext()->SetPrev(pHead);

    // delete the node
    delete n;
    n=0;

    size--;
    return rtnData;
}

e

/*
 * Destructor for a linked node.
 *
 * Deletes all the dynamically allocated memory, and sets those pointers to 0.
 */
LinkedListNode::~LinkedListNode()
{
    delete pNext; // This is where the error pops up
    delete pPrev;
    pNext=0;
    pPrev=0;
}
Foi útil?

Solução

Parece que você está excluindo os nós próximos e anteriores da lista do destruidor. Qual, se pNext e pPrev são LinkedListNode*, significa que você está excluindo recursivamente a lista inteira :-(

Experimente isso:

std::string LinkedList::RemoveFront()
{
    LinkedListNode *n = pHead->GetNext(); // the node we are removing
    std::string rtnData = n->GetData(); // the data to return

    // un-hook the node from the linked list
    pHead->SetNext(n->GetNext());
    n->GetNext()->SetPrev(pHead);

    n->SetNext(0);
    n->SetPrev(0);
    // delete the node
    delete n;
    n=0;

    size--;
    return rtnData;
}

LinkedListNode::~LinkedListNode()
{
}

(Na verdade, você nem precisa redefinir o Anterior e Próximo Ponteiros para 0, pois você vai excluir o nó de qualquer maneira. Deixei essas declarações porque elas pelo menos colocam o nó em um estado consistente, o que é uma boa ideia em Geral. Pode fazer a diferença se você mais tarde, por exemplo, alterar sua estratégia de gerenciamento de memória e decidir armazenar nós não utilizados para reutilização posterior.)

Outras dicas

Parece que o seu LinkedListNode está excluindo seus vizinhos, então, quando você exclui um nó, ele passa a destruir a lista inteira - observe que você não define pNext e pPrev Nula quando você remover seu nó.

Também seu LinkedListNode destruidor é problemático mesmo no caso quando você deseja que toda a lista seja destruída: ter ambos delete pNext e delete pPrev levará a várias chamadas do mesmo destruidor (e acho que eventualmente um estouro de pilha).

Na verdade, você não deveria estar mexendo com os vizinhos em um nó. Isso é para a classe de lista - conecte -os corretamente. No destruidor, você pode defini -los como nulos, mas a menos que você tenha alocado dinamicamente outra coisa - você não precisa ligar delete

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top