Ошибка сегментации при использовании Linux, но не в Xcode

0

У меня возникают проблемы с запуском моего кода в среде 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

  • 1
    Вы, вероятно, должны использовать new вместо malloc .
  • 0
    Это ошибка, потому что malloc не вызывает строковый конструктор. Просто удалите строку с malloc, как советует R Sahu
Теги:
xcode
linked-list
nodes

2 ответа

3
Лучший ответ
        node *temp = new node;
        temp = (node*)malloc(sizeof(node));

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

  • 0
    Ах, спасибо. Вы знаете, почему это будет работать без проблем в Xcode, хотя? Просто любопытно.
  • 0
    @ user1655752, у меня нет опыта работы с Xcode. Я не могу комментировать, почему код работает правильно под Xcode.
1

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню