C++: Segmentation fault (core dumped) (Откуда ошибка? О_о)

Модератор: Модераторы разделов

Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

C++: Segmentation fault (core dumped)

Сообщение Assuri »

При старте программы вылетает такая ошибка. Не могу найти ошибку.

Вот код:

Код:

#include <iostream> #include <fstream> using namespace std; class Person { private: char* name; char* secondname; char* thirdname; unsigned long number; public: friend istream& operator >> (istream&, Person* ); void get_values() { cout << "Введите ФИО: "; cin >> thirdname >> name >> secondname; cout << "Введите номер: "; cin >> number; } void show_pers() { cout << "Номер: " << number << '\n'; cout << thirdname << ' ' << name << ' ' << secondname << '\n'; } }; void write_obj(Person*); Person* read_obj(int); int main() { char ans; int num; Person* Ptr[100]; do { Ptr[num] = new Person; cin >> Ptr[num++]; cout << "Есть ли еще персоны? (y/n) >"; cin >> ans; } while ( ans == 'y' ); for ( int i = 0; i < num; i++ ) write_obj(Ptr[i]); for ( int i = 0; i < num; i++ ) Ptr[i] = 0; for ( int i = 0; i < num; i++ ) Ptr[i] = read_obj(i); return 0; } istream& operator >> (istream& s, Person* ptr) { ptr->get_values(); return s; } void write_obj(Person* obj) { ofstream ouFile; ouFile.open("g12u4.txt", ios::app | ios:: binary ); if ( !ouFile ) { cerr << "Невозможно открыть файл! \n"; exit(1); } else { ouFile.write(reinterpret_cast<char*>(obj),sizeof(*obj)); if ( !ouFile ) { cerr << "Невозможно записать объект! \n"; exit(1); } } } Person* read_obj(int k ) { Person* ptr; ifstream inFile; inFile.open("g12u4.txt", ios::binary ); inFile.seekg(k*sizeof(Person)); inFile.read(reinterpret_cast<char*>(ptr),sizeof(Person)); return ptr; }


Подскажите, пожалуйста.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: C++: Segmentation fault (core dumped)

Сообщение Assuri »

Забавная ошибка кстати. Я забыл инициализировать переменную num нулем, поэтому при Ptr[num] = new Person; происходила ошибка.

Update: Поторопился :) После первого ввода ФИО снова вылетает такая ошибка. Почему? О_о
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: C++: Segmentation fault (core dumped)

Сообщение Uncle_Theodore »

Вообще, в таких случаях надо задействовать дебаггер. valgrind -- прекрасная программа.
Но вот что я вижу просто навскидку

Код: Выделить всё

int main()
{
  char ans;
  int num;
  Person* Ptr[100];
  do
     {
       Ptr[num] = new Person;
       cin >> Ptr[num++];
 <...>

Переменная num не инициализирована. Тем не менее, она используется в качестве индекса массива. Вопрос на засыпку -- чему она равна, когда программа начинает работать?

В самом классе объявляются указатели на char, после чего в них записываются строки. А память кто выделять будет? ;) Ну и так далее.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: C++: Segmentation fault (core dumped)

Сообщение Assuri »

Uncle_Theodore писал(а):
19.07.2007 18:46
В самом классе объявляются указатели на char, после чего в них записываются строки. А память кто выделять будет? ;) Ну и так далее.

*Бьется головой об клавиатуру* :laugh:
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: C++: Segmentation fault (core dumped)

Сообщение Assuri »

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

Код: Выделить всё

Person* read_obj(int k )
{
    Person* ptr;
    ifstream inFile;
    inFile.open("g12u4.txt", ios::binary );
     inFile.seekg((k-1)*sizeof(Person));
    inFile.read(reinterpret_cast<char*>(ptr),sizeof(Person));
    return ptr;
}

Однако после запуска этой функции выводится вот это:
./g12u4: relocation error: ./g12u4: symbol _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc, version GLIBCXX_3.4 not defined in file libstdc++.so.6 with link time reference

Почему?
Спасибо сказали:
Аватара пользователя
nonstop
Сообщения: 132
ОС: Slackware

Re: C++: Segmentation fault (core dumped)

Сообщение nonstop »

Код: Выделить всё

Person* ptr;
...
inFile.read(reinterpret_cast<char*>(ptr),sizeof(Person));

память выдели:
Person* ptr = new Person;

PS:
Лафоре. Объектно-ориентированное программирование в С++
slackware - linux for human brains
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: C++: Segmentation fault (core dumped)

Сообщение Assuri »


ВОт именно этой книги я и делаю упражнение :)

Всем спасибо. Я поменял указатели на объекты в некоторых местах и все заработало.
Спасибо сказали:
Аватара пользователя
nonstop
Сообщения: 132
ОС: Slackware

Re: C++: Segmentation fault (core dumped)

Сообщение nonstop »

книжка отличная, просто читай повнимательнее и не понадобяться никакие форумы ;)
slackware - linux for human brains
Спасибо сказали: