C ++ delete não está funcionando?
-
27-09-2019 - |
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;
}
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