2012-11-19 3 views
3

올바르게 링크 된 목록을 만들었으므로 올바르게 링크되었지만 메모리를 할당 해제하려고하면 삭제할 수없는 것처럼 보입니다. 노드가 있으면 목록이 여전히 존재합니다. 내 목록 deconstructor에 대한 코드 :내 메모리 할당 해제 문제가 무엇인지 이해할 수 없다.

void LL_User::free_memory() { 
    // TODO 
    LL_User_Node *currentNode; 
    currentNode = head; 
    while(currentNode) { 
     LL_User_Node *temp = currentNode; 
     currentNode = currentNode->next; 
     delete temp; 
    } 
    //cout << "LL_User::free_memory() is not implemented yet.\n"; 
} 

LL_User::~LL_User() { 
    if(head == NULL) { 
     return; 
    } 
    free_memory(); 
} 

그리고 내 사용자 클래스가 바르와 deconstructor이 있습니다

User::User() { 
    username = ""; 
    password = ""; 
    first_name = ""; 
    last_name = ""; 
    profile_pic_filename = ""; 
    birth_year = 0; 
    birth_month = 0; 
    birth_day = 0; 
} 

User::~User() { 
    //Nothing placed in body because strings and ints are dealt with by OS? 
} 
+0

왜'free_memory' 함수에서'new' 변수를 사용합니까? – emartel

+2

'currentNode = head;'는 메모리 누수를 생성합니다. – andre

답변

4

지금 작성된 코드는 하나의 심각한 결함이있다; head에 연결된 목록을 삭제하지만 머리를 NULL으로 설정하지 마십시오. 이 시점에서 누군가를 만지면 가비지 포인터를 통해 정의되지 않은 동작이 발생합니다.

이와 같이 목록을 지우려면 머리를 NULL로 설정하십시오. 또는, headNULL이되어야한다는 것을 알고 있기 때문에이 작업이 완료된 후에는 currentNode을 사용하지 마십시오. head 그 자체를 목록을 가리키는 포인터로 사용하십시오. 잠시 생각해 보면 그것이 여러분에게 올 것입니다.

또한 작성한대로 (head == NULL)에 대한 검사는 소멸자에 필요하지 않습니다. 그것은 당신의 free_memory() 기능에서 이미 확인되었습니다.

+0

죄송합니다. 항목이 삭제되었는지 확인하기위한 테스트 부분입니다. – gndimitro

+0

런타임 오류가 없습니다. 사용 가능한 메모리 기능을 실행 한 후 목록에 액세스하려고하면 논리 오류가 발생합니다. 목록이 여전히 존재하고 모든 데이터가 위치 할 수 있습니다. – gndimitro

-1

수동으로 할당을 취소하고 있습니다. 잘못하고 있습니다. 지혜로운 사람처럼 스마트 포인터를 사용하고, 그의 기술에 대한 보수를 받고 싶어하는 사람처럼 작동하는 프로그램을 가지고 있습니다.

+0

특히 OP가 요청되고 확인되면 C++ 11 호환 도구 체인을 사용하여 스마트 포인터에 동의합니다. 나는 부스트 스마트 포인터를 포함하는 것이 그렇게 쓸데없는 생각이지만 사용법에 대해서는 언급하지 않았다. – WhozCraig

+0

그는 C++에 태그를 붙였습니다. 2011 년 한 해 C++ 11입니다.이 상황에서'auto_ptr'조차도 정상적으로 작동합니다. – Puppy

+0

그것은? C++ 11 태그의 사용이 중단 될 시점은 언제입니까? – WhozCraig

관련 문제