그래서 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
으로 설정하지만 예외가 발생합니다. 처음에는 매우 모호한 것에 대해 유감스럽게 생각합니다.
우리는이 값들이 무엇인지, 유효한지, 프로그램이이 단계에 이르렀을 때, SetNext()가 무엇을하는지 등을 모릅니다. 줄 문제가 발생합니다. 디버거를 사용 했습니까? – PaulMcKenzie
a.allocate가 유효한 포인터를 반환합니까? 또한 처음에 last가 NULL 인 경우 충돌이 발생했을 수 있습니다. –
하나의'operator + ='는 void를 반환하지 않아야합니다. – jaho