AVL 트리와 순위 트리가 관련된 과제가 있습니다. 이 특정 지정에서 노드에 다른 정보를 유지하는 순위 AVL 트리를 구현해야합니다.
나는이 문제가있다 :
AVL 트리를 만들었고 순위 트리에 대해 나는 상속을 사용하기로 결정했다.
Rank 트리의 "Insert"함수에서 나는 노드를 인수로받는 "setAllHeights"라는 다른 함수를 호출합니다.
그러나 디버거에서 인수의 값을 볼 때 함수가 NULL 포인터를받는 것을 볼 수 있습니다.
"setAllHeights"함수를 입력하기 전에 인수의 값을 검사했기 때문에 가장 명확하게 NULL이 아니었기 때문에 이유를 알지 못합니다.
무엇이 문제 일 수 있으며 그 이유는 무엇입니까?
귀하의 도움에 감사드립니다.C++ 포인터가 함수 호출 후 값을 상실합니다.
함수 삽입의 코드 :
template<class T, class Compare>
bool RAVL<T, Compare>::insert(const T& data) {
if (root == NULL) {
root = new (nothrow) RNode<T, Compare>(data, NULL);
if (!root)
throw AllocationError();
size++;
return true;
}
Compare cmp;
RNode<T, Compare> *v;
if (find(data, &v))
return false;
if (cmp(v->data, data)) {
v->right = new (nothrow) RNode<T, Compare>(data, v);
if (!v->right)
throw AllocationError();
} else {
v->left = new (nothrow) RNode<T, Compare>(data, v);
if (!v->left)
throw AllocationError();
}
Node<T,Compare> * n=v;
AVL<T,Compare>::setAllHeights(n);
rebalance(v);
size++;
return true;
}
setAllHeights 함수의 코드 :
template<class T, class Compare>
void AVL<T, Compare>::setAllHeights(Node<T, Compare> *n) {
if (n == NULL) {
return;
}
setHeight(n);
setAllHeights(n->parent);
}
이러한 문제를 해결하는 올바른 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –
이것은 정확히 내가 한 일입니다 .. 나는 디버거에서 함수가 NULL 포인터를 받았다는 것을 알았습니다. 왜 그런 일이 일어나는지 이해하지 못합니다. – kidneyThief
디버그 빌드를 수행하고 있습니까? 때때로 최적화 된 빌드에서 이상한 것을 볼 수 있습니다. –