2011-12-27 6 views
1

나는 단순한 목록을 만든 다음 그것을 파괴하고있다. 그리고 뭔가 잘못 가고 나는 항상이 짜증나는 오류 메시지가 얻을 :C++ 초보자 : 소멸자

#include<iostream> 
#include<Windows.h> 
using namespace std; 

struct node 
{ 
    int data; 
    node *next; 
}; 

class list 
{ 
protected: 
    node *top; 
public: 
    list() 
    { 
     top=NULL; 
    } 

    list random() 
    { 
     int x=rand()%10; 
     for(int i=0; i<x; i++) 
     { 
      node *p=new node; 
      p->data=rand()%100; 
      p->next=top; 
      top=p; 
     } 
     return *this; 
    } 

    void show() 
    { 
     for(node *p=top; p; p=p->next) 
     { 
      cout<<p->data<<" "; 
     } 
     cout<<"\n"; 
    } 

    ~list() 
    { 
     node *r; 
     for(node *p=top; p; p=r) 
     { 
      r=p->next; 
      delete p; 
     } 
    } 
}; 

int main() 
{ 
    srand(GetTickCount()); 
    list a; 
    a.random().show(); 
    return 0; 
} 
+6

[3 가지 규칙] (http://stackoverflow.com/q/4172722/636019)을 위반합니다. – ildjarn

답변

0

귀하의 문제는 당신이 당신의 list 복사하는 것입니다하지만 당신은 복사 생성자를 정의하지 : 여기

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 

를 코드입니다 . 암시 적으로 정의 된 복사 생성자는 top 포인터를 복사하여 동일한 노드 체인을 두 번 삭제하려고 시도합니다.

random() 구성원 함수의 return *this;이 값으로 *this 사본을 반환하면 복사본이 생성됩니다.

가장 짧은 수정은 클래스의 개인 섹션에 복사 생성자 및 복사 할당 연산자를 선언하여 클래스를 복사 할 수 없게 만드는 것입니다.

private: 
    list(const list&); 
    list& operator=(const list&); 

그런 다음 random 반환 void, 그것은뿐만 아니라 복사본을 만듭니다 왜 좋은 이유가있을 것 같지 않습니다 수 있습니다.

그러면 그냥이처럼 호출 할 수 있습니다

list a; 
    a.random(); 
    a.show(); 

더 이상 수정이가 list 복사 가능한 수 있도록하는 것입니다 제대로 list이되는 소스의 모든 노드를 복제하는 전체 list(const list&)의 구현 및 list& operator=(const list&)을 만들어 복사 됨.

+0

감사합니다. 좋은 설명입니다. –

3

이 :

list random() 

은 다음과 같아야합니다

list &random() 

이유 버전이 인스턴스 a의 사본을 반환하고, show()가 호출 된 후 그 사본을 파괴 얻을 ..하고 있다는 점이다 파괴는 a이 사용하는 메모리와 동일한 메모리를 파괴합니다. random()에 사본을 반환하려면 a에있는 내부 목록의 전체 복사본을 만드는 복사본 생성자를 구현해야합니다.

0

"성가신 오류 메시지"가 아니므로 프로그램에 메모리가 손상되었다는 메시지가 표시됩니다. 사실 아주 중요합니다.

return *this 일 때 목록 사본을 만들지 만 복사 생성자를 정의하지 않으므로 상위 노드를 두 번 삭제하게됩니다.