Одна ошибка в том, что вам не удалось инициализировать Node
значениями по умолчанию. В вашем конструкторе Dictionary
по умолчанию у вас есть код, который действительно должен быть частью того, что Node
должен делать:
root = new Node ;
for (int i = 0; i < SIZE; i++)
root->dict[i] = nullptr;
Это должна быть работа Node
, а не работа Dictionary
.
Вместо этого у вас есть:
struct Node {
bool isWord;
Node* dict[SIZE];
};
Поэтому каждый раз, когда вы делаете это:
if (!currNode->dict[pos]) {
currNode->dict[pos] = new Node;
Вы создаете неинициализированный Node
объект. Весь этот массив Node::dict
содержит неинициализированные указатели, к которым вы позже попытаетесь обратиться.
Самое простое решение - инициализация объекта Node
нулем.
if (!currNode->dict[pos]) {
currNode->dict[pos] = new Node(); // <-- Note the parentheses
Это автоматически установитуказатели dict
на nullptr
.
Другой способ - убедиться, что Node
объекты созданы со значениями по умолчанию:
#include <algorithm>
struct Node {
bool isWord;
Node* dict[SIZE];
Node() : isWord(false) { std::fill_n(dict, SIZE, nullptr); }
};
При этом даже new Node;
создаст инициализированные узлы.