Странные ошибки при сегментации - PullRequest
0 голосов
/ 13 ноября 2010

Хорошо, так что я работаю над заданием, и на всю жизнь я не могу понять, почему я получаю эти ошибки сегментации.Я все еще нахожусь в процессе изучения c ++, программирования в целом, поэтому я надеялся, что кто-то умнее меня сможет мне помочь.Программа представляет собой самоорганизующееся бинарное дерево поиска, и до сих пор у меня не было с этим особых проблем.Вот начало основной программы, которую я использую для проверки своего класса BST, я не могу изменить программу mian, так как это задание.

int main() {
string input;

// get a list of integer values
cout << "Enter a list of integer values in one line: ";
getline(cin, input);

cout << "\n**CHECKPOINT 1**\n";

// create a binary search tree
BST<int> bst1(input);


if (!bst1.empty()) {
    cout << "\n**CHECKPOINT 2**\n";
    cout << "Inorder traversal: ";
    bst1.printInOrder();
    cout << "Level order traversal: ";
bst1.printLevelOrder();

Я еще не прошел функцию printInOrder (), вот код для этого

template <typename T>
void BST<T>::printInOrder(BSTNode* t) const
{
    if (t->left != NULL)
        printInOrder(t->left);
    std::cout << " " << t->data << " ";
    if (t->right != NULL)
        printInOrder(t->right); 
}

Действительно странная вещь, которая меня смущает, если когда я добавляюquick cout << «Something» в первой строке функции printInOrder, все это suddent будет печатать строку </p>

cout << "Inorder traversal: ";

, и он также начнет печатать некоторые числа в дереве, прежде чем, наконец, дастя снова ошибка сегментации.: /

Итак, я был бы очень признателен, если бы кто-нибудь мог объяснить мне, что происходит WTF.Добавление или вычитание простой строки cout не должно изменить такие вещи, не так ли?Кроме того, я чувствую, что есть лучшие способы отладки этого, если у кого-то есть методы, которые они используют, чтобы выяснить это, пожалуйста, поделитесь :) Заранее спасибо!

РЕДАКТИРОВАТЬ: У меня естьпопробовал отладчик GDB, я не смог разобраться, но опять же я не очень хорошо разбирался в продвинутых функциях отладчиков, поэтому я мог что-то пропустить.Единственная другая функция, которая даже запускается, - это конструктор для построения из строкового ввода.Из того, что я могу сказать из отладчика, это то, что конструктор, кажется, работает нормально, но, тем не менее, вот код

template <typename T>
BST<T>::BST(const std::string input, int th)
{
    threshold = th;
    root = NULL;        
    T v;
    // Make Input String Stream for easy use of >> operator
    std::istringstream iss (input);
    do
    {
        iss >> v;
        insert(v, root);
    }while(iss.good());
}

EDIT2:

Вот код длямоя функция вставки, спасибо за помощь всем!:)

template <typename T>
void BST<T>::insert(const T& v, BSTNode *&t)
{
    if(t == NULL)
        {
            t = new BSTNode;
            t->left = NULL;
            t->right = NULL;
            t->data = v;
            t->searchCount = 0;
        }
    else if( v < t->data )
        insert(v, t->left);
    else
        insert(v, t->right);
}

Ответы [ 3 ]

1 голос
/ 14 ноября 2010

В выводе заметен недостаток перевода строки.Часто буферизация строки означает, что вы ничего не видите, пока не встретите новую строку.

Я бы изменил строку после PrintOnOrder следующим образом: -

    cout << "\nLevel order traversal: ";
0 голосов
/ 14 ноября 2010

Я не вижу здесь ничего плохого. Как отмечали другие, буферизация вывода может означать, что ваш код на самом деле успешно завершает printInOrder (), а затем где-то падает.

0 голосов
/ 14 ноября 2010

В конструкторе вы вставляете v в дерево, даже если чтение данных с iss >> v не удалось.Вероятно, вы предпочитаете что-то вроде этого:

while (iss >> v) {
   insert(v, root);
}

Но, вероятно, настоящая причина вашей ошибки сегментации заключается в insert(), например, если эта функция просто вставляет указатель на параметр (выделенный стек), который она получаетв дерево.Переменная параметра выйдет из области видимости в конце функции (и, следовательно, прекратит существование).Если вы просто сохранили указатель на эту переменную в дереве, этот указатель больше не будет указывать на что-либо полезное.

...