Структура массива - PullRequest
       1

Структура массива

2 голосов
/ 24 октября 2011

Я пытаюсь сделать небольшой пользовательский вектор ...

класс элемента, должен указывать на адрес следующего класса, но с этим кодом

class foo {
private:
    int attr;
public:
    foo(){attr = 10;}
    int get_attr(){return attr;}
    void set_attr(int a){attr =a;}
};

class element_foo {
private:
    foo data;
    element_foo *ptr_next;
public:
    element_foo(){ptr_next = NULL;}
    element_foo(int dat){data.set_attr(dat); ptr_next = NULL;}
    element_foo(int dat, element_foo next){
        data.set_attr(dat);
        ptr_next = &next;
    }
    foo get_data(){return data;}

    element_foo get_next(){return *ptr_next;}

    void print_array(){
        if (ptr_next == NULL) {
            std::cout<< data.get_attr()<<std::endl;
        }
        else {
            std::cout<< data.get_attr()<<std::endl;
            this->get_next().print_array();
        }

    }
};



int main (int argc, char * const argv[]) {
    // insert code here...  
    element_foo a1(10);
    element_foo a2(15,a1);
    element_foo a3(20,a2);

    a3.print_array();

    std::cout << "Hello, World!\n";
    return 0;
}

когда я печатаю a3, возникает ошибка сегментации ... почему? где моя ошибка?

Ответы [ 2 ]

4 голосов
/ 24 октября 2011

Ошибка в этом конструкторе:

element_foo(int dat, element_foo next){
    data.set_attr(dat);
    ptr_next = &next;
}

Вы принимаете адрес местного жителя. ptr_next = &next; Как только функция заканчивается, адрес становится недействительным.

Вам нужно передать next в качестве указателя:

element_foo(int dat, element_foo *next){
    data.set_attr(dat);
    ptr_next = next;
}

И измените свою главную на это:

element_foo a1(10);
element_foo a2(15,&a1);
element_foo a3(20,&a2);

EDIT:

Кроме того, вы можете просто передать его по ссылке:

element_foo(int dat, element_foo &next){
    data.set_attr(dat);
    ptr_next = &next;
}
1 голос
/ 24 октября 2011

Проблема в том, что вы храните указатель на временный объект.

'next' - это просто копия из a1 / a2, которую вы передали из-за копирования по значению.Вы должны использовать копирование по ссылке, чтобы &next ссылался точно на адрес a1 / a2, а не на их копию.

                     v-------- should use "const element_foo &"
element_foo(int dat, element_foo next){
        data.set_attr(dat);
        ptr_next = &next;
    }

// a2->ptr_next is dangling
element_foo a2(15,a1);

При выполнении вышеуказанной строки a2->ptr_next указывает не на a1, а на временный локальный объект, который уже был уничтожен.Таким образом, a2->ptr_next болтается.Любой последующий доступ через этот указатель имеет неопределенное поведение.

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