Члены структур и указателей, C ++ - PullRequest
0 голосов
/ 06 ноября 2010

У меня есть следующий фрагмент кода:

struct Node
{
    Node* left;
    Node* right;
    string data;
};    

void test()
    {
        Node thing;
        thing.data = "h";
        thing.left = NULL;
        thing.right = NULL;

        cout<< "Thing data = " << thing.data << endl;

        Node* thing2;
        thing2->data = "f";
        thing2->left = NULL;
        thing2->right = NULL;

        cout<< "Thing2 data = " << thing2->data << endl;

    }

У меня проблема в том, что thing2-> data = "f" вызывает ошибку сегментации во время выполнения. Я запустил программу через GDB и получил эту ошибку, но я не могу понять, что это значит:

Чтение символов для общих библиотек ++. сделанный Данные вещи = ч

Программа получила сигнал EXC_BAD_ACCESS, не удалось получить доступ объем памяти. Причина: 13 по адресу: 0x0000000000000000 0x00007fff874d59a3 в std :: string :: assign ()

Любая помощь будет великолепна. Спасибо!

Ответы [ 3 ]

2 голосов
/ 06 ноября 2010

thing2 - неинициализированный указатель.Он не указывает на действительный объект Node.

Вы должны выделить его:

thing2 = new Node;

или сделать так, чтобы он указывал на действительный объект Node:

thing2 = & thing;
1 голос
/ 06 ноября 2010

thing2 объявлен как указатель, и вы никогда не выделяете (через new, malloc или даже в стеке) фактический узел, на который будет указывать этот указатель. Таким образом, узел 2 указывает на некоторый неизвестный бит памяти, явно находящийся за пределами адресного пространства вашей программы, и когда вы пытаетесь изменить эту память с помощью вызова thing2->data = "f", ОС справедливо защищает себя (и вас), запрещая ее. Это то, что сег. вина это все.

1 голос
/ 06 ноября 2010

thing2 - указатель на Node, но вы ни на что не указали:

    Node* thing2 = new Node;
    thing2->data = "f";
    thing2->left = NULL;
    thing2->right = NULL;

    cout<< "Thing2 data = " << thing2->data << endl;
    delete thing2;

Приведенный выше код выделяет узел в куче, присваивая его thing2. Когда это сделано с объектом, оно удаляет его.

Более идиоматический подход заключается в использовании умного указателя:

#include <memory>
...
    std::auto_ptr<Node> thing2(new Node);
    thing2->data = "f";
    thing2->left = NULL;
    thing2->right = NULL;

    cout<< "Thing2 data = " << thing2->data << endl;

Поскольку деструктор auto_ptr удаляет все, на что он указывает, вам не нужно явно удалять объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...