BSTree라는 이진 검색 트리 클래스가 있습니다. 그것은 하나의 멤버 인 트리의 루트 노드를 사용했습니다. 노드의 유형은 BSTNode 구조체에 의해 정의됩니다. 하지만 두 멤버를 비교하는 데 사용되는 함수에 대한 포인터 인 다른 멤버를 추가했습니다. 그때부터 문제가 시작되었습니다.포인터 포인터에 주소를 할당하면 세그먼트 화 오류가 발생합니다.
인터페이스 :
template <typename T>
struct BSTNode {
public:
struct BSTNode<T> *left;
struct BSTNode<T> *right;
T key;
BSTNode<T>(T element){ key = element;}
};
template <typename T>
class BSTree {
private:
BSTNode<T> *root;
int (*compare)(T el1, T el2); // this is the new member
public:
BSTree<T>(int (*cmp)(T el1, T el2)) {root = NULL; compare = cmp;}
//...
함수 BSTree :: 추가, 트리에 물건을 추가, 루트 노드에 대한 포인터에 대한 포인터를 사용합니다. 이 함수는 새로운 'compare'멤버를 추가 한 후에 파열되었습니다.
기능 정의 :
template <typename T>
BSTNode<T>* BSTree<T>::add(T element) {
BSTNode<T> **node;
printf("&root = %p\n", &root);
printf("node = %p\n", node); //must be NULL
printf("compare = %p\n", (int(*)(T, T))compare); //address stored in fn pointer
node = &root; /////////// THIS PART produces the segmentation fault. ////////
printf("succeeded");
//...
함수 호출 (주의) :
BSTree<int> bst(&stdcomp); //stdcomp is the integer compare function
bst.add(6);
//...
다음과 같이 기능이 시작 (내가 추락 정확한 라인을 찾기 위해 추가 된 몇 가지의 printf 선이) 출력 :
&root = 0x7fff5fbff8c0
node = 0x0
compare = 0x100001325
Segmentation fault
특히 나에게 당황한 것은 할당이 실패하고 심지어 thoug h 포인터 포인터 '노드'에 저장된 주소를 역 참조하지 않으며 '노드'는 지역 변수이고 참조 해제되지 않습니다. 나는 불법 메모리 접근이 어디에서 발생 하는지를 모른다. 노드를 여러 리터럴 값 (예 : NULL 또는 0x1)으로 초기화하려고 시도했지만 오류가 발생하지 않았습니다. 인쇄 된 내용에 따라 올바른 주소가 할당 된 클래스에 함수 포인터를 추가 한 후에 만 실패했습니다. 템플릿의 오용과 관련이 있습니까?
덧붙여서 BSTree 템플릿은 typenames int와 const char *로 인스턴스화됩니다. 각각은 올바르게 할당 된 다른 비교 함수를 사용합니다 (생각합니다). 필자는 추가 기능을 테스트했으며 둘 다 오류를 생성했습니다. printf
의 %p
이 void
에 대한 포인터를 기대하고 있지만, 함수 포인터를 전달 -
과부하 연산자 =가 트리거되었을 수 있다고 생각하지 않습니까? – Aron
nope. 내가 연산자를 오버로드하지 못했고 클래스에 슈퍼 클래스가 없습니다. S –
왜 'BSTNode ** node'입니까? 왜 포인터 대 포인터가 필요한지 모르겠습니다. –