C ++ в G ++ - ошибка сегментации, когда не используются указатели - PullRequest
2 голосов
/ 12 октября 2010

Я пытаюсь использовать G ++ для компиляции кода на C ++. Кажется, он отлично работает в других компиляторах, но по какой-то причине G ++ не будет выдавать рабочий вывод.

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

Вот фрагмент кода, который сеет хаос:

set<int> t1, t2;

Это странно, потому что следующий код работает нормально:

set<int> *t1 = new set<int>();
set<int> *t2 = new set<int>();

Конечно, я должен использовать -> вместо ., но это ожидаемо. Первый фрагмент кода вызывает ошибку сегментации во время выполнения. Второй интуитивно делает то, что я ожидал.

Во всяком случае, за кадром, .cpp для set имеет это:

#include <cstdlib>
#include <iostream>

using namespace std;

template <class T>
set<T>::set() : bag<T>() {}

template <class T>
set<T>::set(const set<T>& b) : bag<T>(b) {}

.h выглядит так:

#include "bag.h"

template <class T>
class set : public bag<T>
{ 
    public:
        set( );
        set(const set &b);

// ...

};
#include "set.cpp"

И, наконец, файлы bag.cpp и bag.h выглядят так:

using namespace std;

template <class T>
bag<T>::bag() {
    head = NULL;
}

template <class T>
bag<T>::bag(const bag<T>& b) {

    // ...

}

и bag.h:

template <class T>
class bag
{ 
    public:
        bag( );
        bag(const bag &b);

    // ...
};
#include "bag.cpp"

Опять же, я чувствую, что G ++ просто ненавидит меня, но опять же, я могу делать что-то глупое Было бы просто просто толкнуть в правильном направлении.

1 Ответ

8 голосов
/ 12 октября 2010

Вот общий совет, который облегчит вашу жизнь в миллион раз.

Скомпилируйте эту программу с флагами "-g" и "-Wall":

gcc -g -Wall foo.cpp

«-g» добавляет информацию об отладке. «-Wall» выдает дополнительные предупреждения при компиляции. Затем используйте отладчик:

gdb ./a.out

Нажмите Запустите , чтобы запустить вашу программу. Используйте bt чтобы сбросить ваш стек вызовов, как только ваш код сбои. Затем вы можете точно увидеть, где происходит сбой в вашем коде.

Пока вы в этом, google "gdb tutorial". Потратив час или два на обучение правильному использованию GDB, вы окупитесь с интересом. Я обещаю тебе.

...