2014-03-18 4 views
0

내 프로젝트에서 링크 된 목록의 복사본을 만들고 그 내용을 표시 할 수 있도록 프로젝트를 만들고 있습니다. 현재는 작동하지만 프로그램을 종료 할 때마다 충돌이 발생합니다. 문제가 거기에서 오는 것 같다 그래서 프로그램의 주요 부분에 사용되는 복사 생성자의 인스턴스를 제거했습니다.링크 된 목록의 복사 생성자 사용

struct ListNode{ 
    int num; 
    struct ListNode *next; 
}; 
ListNode *head; 

List::List(const List& org){ 
    ListNode *copy=org.head; 
    ListNode *temp; 
    if(copy==NULL){ 
    head=NULL; 
    } 
    else{ 
    head=copy; 
    while(copy!=NULL){ 
     temp=new ListNode; 
     temp->num=copy->num; 
     temp=temp->next; 
     copy=copy->next; 
    } 
    } 

} 

나는 프로그램 자체가 작동 떨어져 내가 그렇게 종료하려고 할 때까지 괄호 {} 중 일부는 내가에서 프로그램을 방지 할 방법을 궁금해하고있어 조금 있다는 것을 알고 있습니다 : 여기에 코드입니다 부서지는거야?

+0

C++ 11에서는'||'로 정의되어 있으며, C++에서는'?|'로 정의되어 있습니다. , 일반적으로 C++에서; ': ['는'{'또는 무엇인가를 타이핑하는 방법이고, 나는 그들을 사용한 적이 없다. 그러나 그들은 거기에있다! –

+0

복사 생성자가 전역 변수'head'를 처리해야하는 이유는 무엇입니까? 복사 생성자는 'this'의 상태를 변경해야합니다. – Mahesh

+0

head 변수는 복사 생성자가 떨어져있는 클래스의 일부입니다. – user2340686

답변

2

큰 종이 한 장을 가져 와서 복사 할 목록을 스케치하고 (4 개의 노드로 가정 해 봅니다) 단계별로 수행해야 할 작업을 수행하십시오. 그런 다음이를 코드로 변환하는 방법을 살펴보십시오.

위의 코드는 목록이 아닌 일련의 연결이 끊어진 노드를 만듭니다.

0

새로 생성 된 List는 복사 된 인스턴스 head을 가리키는 head입니다. 따라서 두리스트를 지우면 동일한 메모리를 두 번 삭제하려고 시도 할 것입니다 (소멸자가 노드를 삭제하려고한다고 가정합니다). 그건 그렇고, 생성 된 노드는 할당되지만 참조되지는 않습니다 (즉, 메모리 누수가 있음). 매우 비슷한 질문에 대한 답은 Coding a function to copy a linked-list in C++을 참조하십시오.