2016-09-12 4 views
0

링크 된 목록을 만들려고하고 있지만 노드를 두 번 삭제하기 때문에 문제가 발생합니다. 이 문제는 함수에 전달 된 노드가 함수로 전달 될 때 발생합니다 (함수가 참조로 전달 된 경우 모두 정상입니다). 그러면 함수에 전달되는 객체가 포인터가 노드를 가리키는 방식으로 복사되고 있다고 생각됩니다. 원래 목록에서 새 목록이 아닙니다. 나는이 문제를 해결하기 위해 = 연산자를 오버로딩하려했지만이 방법도 작동하지 않았다. 내가 잘못하고있는 것에 대한 설명은 훌륭 할 것이다. 도움을C++ 연결된 목록이 작동하지 않습니다.

감사

#include <iostream> 

struct node{ 
    node(int n){ 
     if (n == 1){ 
      data = 1; 
      next = NULL; 
     } 
     if (n == 2){ 
      data = 2; 
      next = new node(1); 
      next -> next = NULL; 
     } 
    } 
    ~node(){ 
     std::cout << data << std::endl; 
     if (next != NULL) delete next; 
    } 

    void operator=(node a){ 
     next = NULL; 
    } 

    int data; 
    node* next; 
}; 

void func2(node v){ 
} 


int main(){ 

    node v(2); 
    if (v.next -> next == NULL) std::cout << "true\n"; 
    func2(v); 

    return 0; 
} 

답변

3

귀하의 의혹이 올바른지,하지만 거기에 문제가있다; 노드를 func2에 전달하면 전체 목록이 아닌 첫 번째 노드 만 복사됩니다. 복사 생성자는 첫 번째 노드와 포인터를 첫 번째 노드 (원래 두 번째 노드를 가리킴)에 복사하므로 v이 범위를 벗어나 func2이되면 한 번 삭제되고 범위를 벗어나면 다시 삭제됩니다. main 전체 복사를 수행하고 모든 노드를 새로운 주소로 복사하기 위해 복사 생성자를 작성해야합니다.

복사 생성자는 대부분 *this을 반환해야한다는 것을 기억하십시오. 이는 C++ FAQ 및 Scott Meyers의 "Effective C++"책에 있습니다. 따라서 서명은 다음과 같아야합니다.

node& operator=(const node& node); 

할당 연산자에 과부하가 발생하는 경우 복사 생성자를 정의해야합니다. 그건 그렇고, 문제를 잘 설명 해줘.

편집 : 코드는 다음과 같습니다. 나는 이것을 시험하지 않았 음을 사과한다. 나는 타블렛에서 편집 중이며 고통 스럽습니다. ...

#include <iostream> 

struct node{ 
    node(const node& toCopy) : data(toCopy.data) 
    { 
     if(toCopy.next != null) { 
      next = new node(toCopy); 
     } 
    } 

    node(int n){ 
     if (n == 1){ 
      data = 1; 
      next = NULL; 
     } 
     if (n == 2){ 
      data = 2; 
      next = new node(1); 
      next -> next = NULL; 
     } 
    } 

    node& operator=(const node& toCopy) { 
     if(&toCopy != this) { 
      data = toCopy.data; 

      if(next != NULL) { 
       next = new node(toCopy); 
      } 
     } 

     return *this; 
    } 

    ~node(){ 
     std::cout << data << std::endl; 
     if (next != NULL) delete next; 
    } 

    int data; 
    node* next; 
}; 

void func2(node v){ 
} 


int main(){ 
    node v(2); 
    if (v.next -> next == NULL) std::cout << "true\n"; 
    func2(v); 

    return 0; 
} 
+0

답변 해 주셔서 감사합니다. 내가 어떻게 고칠 것인가에 대해 설명하면 위대한 일이 될 것입니다. 나는 왜 내 오퍼레이터 = 과부하가 작동하지 않고 그 문제를 스스로 해결하는지에 대해서는 분명하지 않다. – fred

관련 문제