У меня есть двоичный класс дерева поиска, 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'. Функция начинается следующим образом (она имеет некоторый 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
Что особенно озадачивает меня, так это то, что назначение не срабатывает, даже h он не разыскивает адрес, который хранится в моем узле указателя на указатель, а «node» является локальной переменной и не разыменовывается; Я не знаю, где происходит незаконный доступ к памяти. Я попытался инициализировать узел несколькими буквальными значениями (например, NULL или 0x1), и они не вызвали ошибку. Это произошло только после того, как я добавил указатель функции к классу, который в соответствии с тем, что напечатан, получает правильный адрес. Имеет ли это какое-либо отношение к неправильному использованию шаблонов?
Кстати, шаблон BSTree создается экземплярами типа int и const char *, каждый из которых имеет другую функцию сравнения, которая правильно назначена (я думаю). Я протестировал их функцию добавления, и оба вызвали ошибку.
Я не предполагаю, что у вас есть перегрузка оператора =, который может срабатывать? – Aron
nope. я не перегружал любого оператора, а мои классы не имеют суперклассов: S –
Почему у вас есть 'BSTNode ** node'? Я не понимаю, почему нужны указатели на указатели. –