2014-11-29 2 views
0

У меня возникают проблемы с запуском моего кода в среде Linux. Однако он отлично работает с Xcode. Я использовал gdb backtrace для того, чтобы указать, где моя проблема, и указывает на строку кода, где я устанавливаю поле «запись» узла (строка), равное строке, считанной из текстового файла (также строка). У меня есть чувство, что я не включаю что-то, или я включаю неправильную вещь. Я нахожусь на моей голове, так как я только начал C++ в этом месяце. Пожалуйста помоги!Ошибка сегментации при использовании Linux, но не в Xcode

#include <iostream> 
#include <fstream>  // for reading dictionary.txt 
#include <cstdlib>  // for rand() and srand() 
#include <time.h>  // for time 
#include <string>  // for string 

using namespace std; 

...

struct node 
{ 
    string entry;  // stores the dictionary entry 
    node *next;   // stores pointer to next node in list 
}; 
node *head = NULL; 

...

ifstream dictionary; 
dictionary.open(filename); 
string line; 
if (dictionary.is_open()) 
{ 
    while (getline(dictionary,line)) 
    { 
     if (head == NULL) 
     { 
      node *temp = new node; 
      temp = (node*)malloc(sizeof(node)); 
      temp->entry = line; // this is where I segfault according to backtrace 
      temp->next = NULL; 
      head = temp; 
     } // if first entry 

... и ошибка я получаю с помощью GDB:

Program received signal SIGSEGV, Segmentation fault. 0x0000003ce2a9d588 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /usr/lib64/libstdc++.so.6

+1

Возможно, вы должны использовать 'new' вместо' malloc'. – didierc

+0

Это segfault, потому что malloc не вызывает конструктор строк. Просто удалите строку с malloc по рекомендации R Sahu – cup

ответ

3
 node *temp = new node; 
     temp = (node*)malloc(sizeof(node)); 

Почему вторая линия? Это источник вашей проблемы. Когда вы используете память malloc с объектами C++, объекты не инициализируются. Удалите вторую строку, и все должно быть хорошо.

+0

Ahh спасибо. Знаете ли вы, почему это будет работать без проблем в Xcode? Просто любопытно. – user1655752

+0

@ user1655752, у меня нет опыта работы с Xcode. Я не могу прокомментировать, почему код работает правильно в Xcode. –

1

Удалить эту строку

temp = (node*)malloc(sizeof(node)) 

Поскольку таНос не может вызвать конструктор струны, поэтому, когда вы Asign строку = «некоторые строки», доступ к запрограммируйте не написано памяти, будет сегментация ошибки. Запись неписаной памяти - это основная причина ошибки сегментации.

Смежные вопросы