Вектор из объектов класса. Ошибка дампа стэка

253
26 октября 2017, 09:55

Добрый вечер. В задании необходимо было создать лес бинарных деревьев по введённым данным, единичное дерево было реализовано через класс:

class btree
{
public:
  btree();
  ~btree();
  void print();
  void insert(int key, std::string data);
  void destroy_tree();
private:
  void print(node *leaf);
  void destroy_tree(node *leaf);
  void insert(int key, std::string data, node *leaf);
  node *root;
};

Где node представляет:

struct node
{
    int key_value; //глубина узла
    std::string data; //значение узла
    node* left; //левая ветка
    node* right; //правая ветка
};

Дерево образуется так: ( - уровень ниже, ) - уровень выше, ',' - узел того же уровня, пример строки в коде:

int main(void)
{
    std::string str;
    std::string buff;
    btree tree;
    std::vector<btree> woods;
    unint i=0;
    unint n=0;
    str="a(d(e)c(n))";
    while(str[i])
    {
        if(str[i]!='(' && str[i]!=')' && str[i]!=',')
            buff+=str[i];
        if(str[i]==',') //Встречаем ,
        {
            if(n==0) //Если уровень 0, то кладём дерево в массив и чистим нынешнее
                {
                    woods.push_back(tree);
                    tree.destroy_tree();
                }
            else //Отлично от нуля - разные узлы
                {
                    tree.insert(n, buff);
                    buff.clear();
                }
        }
        switch (str[i])
        {
        case '(': //Встречаем ( - увеличиваем уровень на 1
            tree.insert(n, buff); // кладём буферную строку
            buff.clear(); //очищаем её
            n++;
            break;
        case ')': //Встречаем ) - уменьшаем уровень на 1
            tree.insert(n, buff); // кладём буферную строку
            buff.clear(); //очищаем её
            n--;
            break;
        }
        i++;
    }
    tree.print();
}

Единичное дерево код прекрасно обрабатывает и все функции работают корректно: insert - добавить, print - вывести дерево, destroy_tree - уничтожить дерево. Если попытаться добавить дополнительное дерево (такого же типа строка, через запятую при уровне равном 0) ты выскакивает следующая ошибка:

0 [main] BinWTreeEcl 5876 cygwin_exception::open_stackdumpfile: Dumping stack trace to BinWTreeEcl.exe.stackdump

BinWTree - название исходника. Помогите понять в чём заключается ошибка, пробовал аналогично через отдельный список - та же ситуация. Какие варианты ещё есть?

Answer 1

Не реализован конструктор копирования/перемещения (и операторы присваивания тоже). Отсюда получаем:

woods.push_back(tree);//Добавили в вектор (скопировался root)
tree.destroy_tree();//Следом уничтожили и в векторе теперь висячий указатель.
READ ALSO
multiple types in one declaration как исправить [требует правки]

multiple types in one declaration как исправить [требует правки]

У меня есть код на C++ с использованием qt:

391
Visual Studio 2013 не запускает программу из за ucrtbased.dll

Visual Studio 2013 не запускает программу из за ucrtbased.dll

я распаковал openCV прописал переменную и path сделал настройки в проекте, ничего красным не светится - при компиляции ошибка

240
Знание C++ со стороны хакера [требует правки]

Знание C++ со стороны хакера [требует правки]

Вот вопрос возник на днях,а хакеры допустим пишущие програмы(взломы) на c++ знают этот язык полностю или отдельные разделы языка?(Очень важный...

260
Получение полного пути к любой dll библиотеке

Получение полного пути к любой dll библиотеке

Разрабатываю приложение, выводящее различную информацию о процессах в системеОдна из задач - вывести список используемых процессом dll библиотек...

222