У меня есть класс бинарного дерева поиска, 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 :: add, которая добавляет материал в дерево, использует указатель на указатель на корневой узел.Эта функция прервалась после того, как я добавил новый элемент сравнения.Функция начинается следующим образом (у нее есть несколько строк printf, которые я добавил, чтобы найти точную строку, которая вылетела):
Определение функции:
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);
//...
Вывод:
&root = 0x7fff5fbff8c0
node = 0x0
compare = 0x100001325
Segmentation fault
Что меня особенно озадачивает, так это то, что назначение не выполняется, даже если оно не разыменовывает адрес, который хранится в моем указателе на указатель 'node'и «узел» является локальной переменной и не разыменовывается;Я не знаю, где происходит незаконный доступ к памяти.Я попытался инициализировать узел несколькими литеральными значениями (например, NULL или 0x1), и они не выдавали ошибку.Сбой произошел только после того, как я добавил указатель функции в класс, которому в соответствии с напечатанным присваивается правильный адрес.Это как-то связано с неправильным использованием шаблонов?
Кстати, шаблон BSTree создается с typenames int и const char *, каждая из которых имеет свою функцию сравнения, которая назначена правильно (я думаю).Я проверил их функцию добавления, и оба произвели ошибку.