2016-09-21 2 views
0

링크 된 목록에서 노드를 삭제할 때 next을 NULL로 설정해야합니까?기본 소멸자는 멤버 포인터가 가리키는 메모리를 해제합니까?

ListNode이

struct ListNode { 
    int val; 
    ListNode* next; 
    ListNode(int x): val(x) {} 
} 

로 정의됩니다 지금은 소멸자에서 삭제 될 것입니다 m

ListNode *tmp = m->next; 
m->next = m->next->next; 
delete tmp; 

tmp->next 경우 후 노드를 삭제 싶어, 링크 된 목록이 문제에 있어야합니다. 삭제되지 않습니다

ListNode *tmp = new ListNode(0); 
tmp->next = new ListNode(1); 
delete tmp; 

tmp->next 경우, 다시 기억의 조각을 찾을 수있는 방법이 없습니다 : tmp->next가 삭제되지 않는 경우, 메모리 누수가 발생합니다 다른 경우가있을 수 있습니다.

그래서 여기서 딜레마가 발생합니다. 기본 소멸자는 실제로 무엇을합니까?

+0

구성원 포인터에서 삭제를 호출하지 않습니다. –

+0

어떻게 기본 소멸자가 해당 메모리를 해제할지 여부를 알 수 있습니까? 메모리가 동적으로 할당되었다고 보장 할 수는 없습니다. – AnT

답변

1

기본 소멸자는 소멸자가있는 모든 멤버 변수를 삭제하고 다른 작업은 수행하지 않습니다.

없음 ListNode의 멤버 변수에는 소멸자가 있으므로 ListNode의 기본 소멸자는 아무 작업도 수행하지 않습니다.

next은 멤버 변수이지만, next은 가리키는 대상이 아닙니다.

+0

그렇다면'tmp-> next '를 삭제하거나'tmp'를 삭제하기 전에 다른 포인터를 주어야한다는 뜻입니까? –

+0

@KingstonChan 당신은 이미 그 질문에 대답하는 데 필요한 정보를 가지고 있습니다. 그렇게 생각하니? – immibis

+0

감사! 너는 매우 도움이된다! –

0

그래서 여기에 딜레마가 있습니다. 기본 소멸자는 실제로 무엇을합니까?

기본 소멸자는 멤버 변수를 파괴합니다. 멤버 변수에 사용자 정의 소멸자가 있으면 호출됩니다. 기본 유형 인 경우 아무 것도 발생하지 않습니다.

위에서 설명한 것보다 더 많은 것이 있습니다. 표준의 소멸자에 대한 섹션을 읽는 것이 가치가있을 것입니다. C++ 11에서는이 섹션이 12.4입니다. cppreference.com에서 자세한 정보를 찾을 수도 있습니다.

관련 문제