2016-12-07 7 views
0

연결된 목록의 전체 복사본에 세그먼트 오류가 계속 발생합니다. Copy Contructor와 대입 연산자 (operator =)에서이 딥 카피를 사용하고 있으며 이것이 seg faulting이라는 결론에 도달했습니다.노드 포인터를 반환하는 연결된 목록의 딥 복사

bigint::Node* bigint::deepcopy(bigint::Node* target){ 
     bigint::Node* current = target; 
     bigint::Node*cpy = new Node; 
     cpy->digit = current->digit; 
     Node* const hd = cpy; 
     current = current->next; 
     while(current != nullptr){ 
      bigint::Node* tmp = new Node; 
      tmp->digit = current->digit; 
      cpy->next = tmp; 
      cpy = cpy->next; 
      current = current->next; 
     } 
    return hd; 
} 

내 노드 구조체 보이는 같은 : 그냥이 기능과 관련되는 개인에 무엇인지 보여주는

private: 
struct Node{ 
     int digit; 
     Node* next; 
}; 
Node* head; 
static Node* deepcopy(Node* target); 

내 클래스가 폐쇄되고 모든. 어떤 조언을 주셔서 미리 감사드립니다.

+0

http://stackoverflow.com/questions/21476869/constant-pointer-vs-pointer-to-constant – macroland

+0

우선 내가 할 수있을 때마다 unique_ptr 및 포인터 대신 참조를 사용하는 것이 좋습니다. 그것은 보통 당신이 지금 최소로하고있는 것처럼 오류를 줄입니다. 또한 딥 카피는 정확히 무엇을 의미하며 그 복사본으로 무엇을 할 계획입니까? –

+0

@ MarošBeťko "전체 복사본"은 목록에있는 모든 노드가 복사/복제된다는 의미입니다. 그래서 결국 같은 순서로 같은 값을 가진 또 다른리스트를 얻게 될 것입니다. – Thomas

답변

0

deepcopy 함수를 사용할 때는 매개 변수 target이 nullptr이 아니어야합니다. 따라서 deepcopy 기능의 시작 부분에 if (target == nullptr)을 확인해야합니다.

while 루프가 끝나면 새 목록의 꼬리를 nullptr로 설정해야합니다.

게시 한 정보에서 null 포인터에 ->digit 또는 ->next을 사용하는 것으로 보입니다.

이 오류가 계속 발생하면 예제 코드를 제공하는 것이 좋습니다.

+0

좋아요. 처음에는 체크를했고, 기본적으로 nullptr이 새로운 노드를 만들었다면 * 그것을 nullptr과 동일하게 설정하고 반환했습니다. 몇 가지 테스트를 통해 코드 시작 부분에 있지만 while 루프의 어딘가에 오류가 발생했음을 알았습니다. 나는 cpy-> next = nullptr;을 추가했습니다. 돌아 오기 전에 hd; 그게 당신이 의미하는 바가 확실하지 않습니다. 두 가지 조정을 한 후에도 여전히 동일한 위치에서 seg 오류가 발생합니다. –

+0

귀하의 deepcopy 코드로 테스트 할 코드를 작성했습니다. 하지만 여기서 잘 작동하는 것 같습니다. [여기는 내 테스트 코드입니다] (http://paste.ubuntu.com/23592508/). – September