У меня возникают проблемы с запуском моего кода в среде Linux. Однако он отлично работает с Xcode. Я использовал backdrace gdb, чтобы указать, где моя проблема, и указывает на строку кода, где я устанавливаю поле "запись" узла (строка), равное строке, считанной из текстового файла (также строка). У меня есть чувство, что я не включаю что-то, или я включаю неправильную вещь. Я нахожусь над моей головой, так как я только что начал c++ в этом месяце. Пожалуйста помоги!
#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
node *temp = new node;
temp = (node*)malloc(sizeof(node));
Почему вторая линия? Это источник вашей проблемы. Когда вы используете память malloc
с объектами C++, объекты не инициализируются. Удалите вторую строку, и все должно быть хорошо.
Удалить эту строку
temp = (node*)malloc(sizeof(node))
Поскольку malloc не может вызывать конструктор строк, поэтому, когда вы назначаете строку = "некоторая строка", программа получает доступ к неписаной памяти, будет иметь ошибку сегментации. Записывать неписаную память является самой причиной ошибки сегментации.
new
вместоmalloc
.