2014-02-20 5 views
1

그래서 C++에서 LinkedList을 다시 만들고 내 목록에서 포인터를 마지막으로 Node으로 변경하려고합니다. 여기에 모든 마법과 오류가 발생하는 오버로드 된 += 운영자가 있습니다. 포인터를 변경하는 두 가지 다른 방법이 있지만 모두 Unhandled exception at 0x00ee42f3 in Lab3.exe: 0xC0000005: Access violation writing location 0xccccccec.을 던집니다. 무슨 일이 일어나고 어떻게 해결할 수 있습니까? 더 명확히하기 위해C++ 연결된 목록의 다음 노드 포인터 설정

void MyLinkedList::operator+=(const std::string& s) 
{ 
    allocator<Node> a; 
    Node* n = a.allocate(1); 
    a.construct(n, s); 


    if (first == NULL) 
     first = n; 
    else 
    { 
     (*last).next = n; // crashes here 
     (*last).SetNext(n); //also will crash here, if the previous statement is removed 
     last = n; 
    } 
} 

, 그것은 통과 첫 번째 Node을 설정하는 방법을 종료 한 것 그것을 실행하고 else 문을 입력합니다라고 다음에. 이 시점에서 두 번째가 Node이고, 메모리에 할당되고 인스턴스화됩니다. 내가 뭘 하려는지 Node 처음에 Node* next 포인터를이 새로운 Node으로 설정하지만 예외가 발생합니다. 처음에는 매우 모호한 것에 대해 유감스럽게 생각합니다.

+5

우리는이 값들이 무엇인지, 유효한지, 프로그램이이 단계에 이르렀을 때, SetNext()가 무엇을하는지 등을 모릅니다. 줄 문제가 발생합니다. 디버거를 사용 했습니까? – PaulMcKenzie

+0

a.allocate가 유효한 포인터를 반환합니까? 또한 처음에 last가 NULL 인 경우 충돌이 발생했을 수 있습니다. –

+0

하나의'operator + ='는 void를 반환하지 않아야합니다. – jaho

답변

2

allocateSetNext 특정 구현을 알 수 없습니다. 그들은 아무 문제없는 경우

, 이쪽을 봐주십시오

if (first == NULL) 
{ 
    first = n; 
    last = first; // You should assign last with the head node pointer. 
} 
... 

는 어쩌면 그것은 도움이됩니다.

+0

그걸 고쳐 줘! 정말 고맙습니다! 편집 : 왜 그것을 고정 알아요. 나는 너무 바보 같이 느껴진다. 나는 결코 마지막으로 아무것도하지 않는다. 어리석은 실수는 ... – user3280133

+0

"마법"에 의지하지 말아야한다. 돌아가서 당신이 잘못한 것을 이해하십시오. 목록이 비어 있으면 "마지막"포인터를 초기화하지 않은 것입니다. 그런데 나중에, 당신은 누구를 가리키는 "마지막"포인터를 사용합니다 - 어디서이 주소에 쓰려고 시도합니다. – PaulMcKenzie

1

+ = 연산자는 많은 문제가 있습니다.

1) 연산자 + =는 에 대한 참조를 반환해야하며 void가 아닙니다. 그렇지 않으면 a + = b는 의미가 없습니다.

MyLinkedList& MyLinkedList::operator+=(const std::string& s) 
{ 
    //... 
    return *this; 
} 

2) 둘째, 목록이 비어 있으면 마지막 포인터가 초기화되지 않았을 수 있습니다.

3) 스타일 문제 - 왜 이러는 :

(*last).next = n; 

그냥이해야 할 때

last->next = n; 

를?

관련 문제