Получение ошибки сегментации в C ++, но почему? - PullRequest
0 голосов
/ 16 марта 2010

Я получаю ошибку сегментации в этом коде, но я не могу понять, почему. Я знаю, что ошибка сегментации происходит, когда указатель равен NULL или когда он указывает на случайный адрес памяти.

 q = p;
        while(q -> link != NULL){
            q = q -> link;
        }
        t = new data;
        t -> city = cityName;
        t -> latitude = lat;
        t -> longitude = lon;
        q -> link = t;

Это ошибка, которую я получаю в консоли:

line 33: 2219 Segmentation fault    sh "${SHFILE}"

Ответы [ 6 ]

6 голосов
/ 16 марта 2010

В предложении else в Database::add вы не устанавливаете t->link = NULL, поэтому он неинициализирован.

Вы должны добавить конструктор для data, который инициализирует его члены, или использовать инициализирующее значение new, чтобы убедиться, что все инициализировано правильно:

t = new data(); // note the parentheses
3 голосов
/ 16 марта 2010

Вы не устанавливаете базу данных :: данные :: ссылка на NULL в Database::add:

    t = new data;
    t -> city = cityName;
    t -> latitude = lat;
    t -> longitude = lon;
    t -> link = NULL;

EDIT : Я бы добавил конструктор для Database::data для инициализации различных членов. Что-то вроде:

class Database {
    struct data {
        data(): latitude(0.0), longitude(0.0), link(NULL) {}
        ...
    };
    ...
 };

Тогда у вас нет неинициализированной памяти для беспокойства.

3 голосов
/ 16 марта 2010

Возможно, это потому, что когда вы добавляете новый узел в конец списка:

else{
    q = p;
    while(q -> link != NULL){
        q = q -> link;
    }
    t = new data;
    t -> city = cityName;
    t -> latitude = lat;
    t -> longitude = lon;
    q -> link = t;
}

вы не устанавливаете t->link = NULL;.

1 голос
/ 16 марта 2010

Вам необходимо присвоить т ссылку на NULL:

else{
    q = p;
    while(q -> link != NULL){
        q = q -> link;
    }
    t = new data;
    t -> city = cityName;
    t -> latitude = lat;
    t -> longitude = lon;
    t -> link = NULL; // add this
    q -> link = t;
}
1 голос
/ 16 марта 2010

Могут быть и другие проблемы, но вот одна:

else{
    q = p;
    while(q -> link != NULL){
        q = q -> link;
    }
    t = new data;
    t -> city = cityName;
    t -> latitude = lat;
    t -> longitude = lon;
    q -> link = t;
}

Вы никогда не устанавливаете t->link в ноль, и поэтому он заполнен мусором.

1 голос
/ 16 марта 2010

Компилировать с -g в качестве аргумента для g ++

Затем из командной строки "gdb (двоичное имя)"

внутри GDB, "запустить", и он будет работать до тех пор, пока ошибка

введите "bt", чтобы увидеть трассировку стека

...