2014-11-15 6 views
0

복사 생성자에서 전체 연결된 목록을 복사하려고 시도하지만 액세스를 계속합니다. 복사 구성이 제대로 작동하지 않는 이유는 무엇입니까? 오류 : 주요복사 생성자가 연결된 목록을 통과합니다. 구현

NodeSLList list2 (list1); 
cout << "cout << list2 " << endl; 
cout << list2 << endl; 

경찰 생성자가 제대로 연결리스트를 복사하지 않았기 때문에 오류가 cout << list2 << endl; 발생에

Unhandled exception at 0x00AE506C in program.exe: 0xC0000005: Access violation reading location 0x00000004. 

복사 생성자

NodeSLList::NodeSLList(NodeSLList & list) 
{ 
    head = list.head; 
    IntNode *tmp = head; 
    cout << "copy constructor called" << endl; 

    int size; 
    size = list.GetSize(); 

    for (int i = 1; i <= size; i++) 
    { 
     tmp->data= list.RetrieveNode(i).data; 
     tmp->next = list.RetrieveNode(i).next; 
     tmp = tmp->next; 
    } 
} 

.

head = list.head; 
IntNode *tmp = head; 

당신은 포인터 값을 복사하지한다 :

+1

'1'에서 루프를 시작해야하는 이유가 있습니까? C++에서 첫 번째 요소는 (일반적으로) '0'입니다. 또한, 노드의 뒤쪽에 노드를 추가하는 함수가 있습니까? 그렇다면 복사 생성자는 코딩 한 것보다 훨씬 간단합니다. – PaulMcKenzie

+0

연결된 목록을 설정하는 방법은 1에서 N입니다. –

+1

내 의견이 업데이트되었습니다. 목록의 뒤쪽에 추가하는 함수가 있으면 복사 생성자에서 사용합니다. 0 대신 1에서 카운트를 시작하는 것과 관련하여, 1에서 시작하는 많은 시간이 off-by-1 버그의 원인입니다. – PaulMcKenzie

답변

2

하나의 문제는 이것이다. 동일한 메모리를 가리키는 두 개의 포인터로 감습니다. 두 개체 모두 서로 다른 head 값을 가져야합니다.

링크 된 목록에 노드를 추가하는 기능이있는 경우 복사 생성자에서 노드를 사용하여이를 방지 할 수 있습니다.

NodeSLList::NodeSLList(const NodeSLList & list) : head(0) 
{ 
    int size; 
    size = list.GetSize(); 
    for (int i = 1; i <= size; i++) 
     addData(list.RetrieveNode(i).data); 
} 

이것은 당신이 전달 된 데이터를 사용하여 새 노드를 추가 addData 유사한 기능이 있어야이 제대로 작동하는지 확인하기 위해 addData 기능을 테스트합니다 예를 들면 다음과 같습니다.. 복사 생성자는 그냥 루프에서 호출합니다.

마지막으로 복사 생성자 (및 소멸자)와 함께 사용할 할당 연산자도 필요합니다. 할당 연산자는 복사 생성자 및 소멸자를 도우미 함수 (예 : copy/swap 관용구)로 쓸 수 있습니다.