2010-04-17 3 views
3

삭제 및 소멸자에 문제가 있습니다. (나는 바보 같은 실수를 저 지르지 만, 아직 파악하지 못했습니다.)C++ 삭제가 작동하지 않습니까?

소멸자를 단계별로 실행하고 포인터에 대한 삭제를 호출하면 "주소의 메모리에 액세스 할 수 없습니다."라는 메시지가 나타납니다 (일부 주소는입니다).

관련 코드는 다음과 같습니다

/* 
* 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; 
} 

/* 
* 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; 
} 

답변

5

당신이 소멸자에서 목록의 다음 및 이전 노드를 삭제하는 것 같다. 어느, pNextpPrevLinkedListNode*을 경우, 재귀이 시도

:-(전체 목록을 삭제하는 것을 의미한다 : 사실 당신도 이전 및 다음 포인터를 재설정 할 필요가 없습니다 (

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() 
{ 
} 

을 어쨌든 노드를 삭제할 것이기 때문에 0으로 설정합니다. 나는 적어도 노드를 일관된 상태로두기 때문에이 문장을 남겨 두었습니다. 이것은 좋은 생각입니다. 나중에 메모리 관리를 변경하면 차이가 생길 수 있습니다 나중에 사용하기 위해 사용하지 않는 노드를 저장하기로 결정하십시오.)

+0

현재 노드에 저장된 다음 노드와 이전 노드 (각 노드에는 일부 문자열 데이터가 포함되어 있습니다. 목록의 다음 노드와 이전 노드를 가리키는 포인터). 우리가 링크 된 목록에서이 노드를 빼내고 동적으로 할당 된 메모리를 모두 돌려 주길 원했기 때문에 원하는 동작입니다. EDIT - wait, 당신이 말하는 것을 볼 수 있습니다. – vimalloc

+0

@kyeana : 원하는 경우에만 제거중인 단일 노드와 연관된 메모리를 반환하십시오. –

+3

그보다 더 나쁩니다. 실제로 목록의 끝까지 (첫 번째 삭제시 재귀) 전달을 삭제 한 다음 두 번째 마지막 노드를 삭제하려고 시도합니다 마지막 노드의 소멸자 내부에서 다시 충돌이 발생합니다. X, Y 및 Z가 마지막 세 노드 인 경우 ~ X는 Y를 삭제하고 Y는 ~ Z를 삭제하고 ~ Z는 Y를 다시 삭제합니다. –

1

LinkedListNode이 이웃 노드를 삭제하고있는 것으로 보이므로 한 노드를 삭제하면 노드 전체를 삭제합니다. 노드를 제거 할 때 pNextpPrev을 NULL로 설정하지 마십시오. 당신은 전체 목록이 파괴하고자 할 때

또한 당신의 LinkedListNode 소멸자도 경우에 문제가있다 : 모두 delete pNextdelete pPrev이 같은 소멸자의 여러 통화로 이어질 것 가지고 (그리고 나는 결국 스택 오버플로를 생각한다).

+0

oh god ... 노드 2는 노드 1과 노드 3을 삭제합니다. 노드 1과 노드 3은 각각 노드 2와 노드 3을 삭제하고 노드 2는 4 번 삭제합니다. –

0

실제로 노드의 이웃을 망칠 필요가 없습니다. 그것은 목록 클래스가 할 일입니다 - 제대로 연결하십시오. 소멸자에서는 null로 설정할 수 있지만, 동적으로 다른 것을 할당하지 않으면 호출 할 필요가 없습니다. delete

관련 문제