Терминальный процесс завершается при пересылке ошибки ссылки - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь написать список.И я использовал forwarding reference для обработки lvalue и rvalue.Но программа работает неправильно при вызове оператора new в функции insertAsPrev.

template <typename T>
class ListNode
{
        friend class List<T>;
    public:
        using pnode = ListNode<T> *;
        ListNode() : prev(nullptr), next(nullptr) {}
        ListNode(T const & e, pnode p=nullptr, pnode n=nullptr) 
            : data(e), prev(p), next(n) {}
        template <typename X>
        ListNode(X && e, pnode p=nullptr, pnode n=nullptr) 
            : data(std::forward<X>(e)), prev(p), next(n) { cout << "ini\n";}
        template <typename X>
        pnode insertAsPrev(X && e);
        template <typename X>
        pnode insertAsNext(X && e);
    private:
        T data;
        pnode prev;
        pnode next;
};

template <typename T>
template <typename X>
ListNode<T> * ListNode<T>::insertAsPrev(X && e)
{
    cout << "insert as prev\n";
    pnode node = new ListNode<T>(std::forward<X>(e), prev, this);
    prev->next = node; prev = node;
    return node;
}

template <typename T>
List<T>::List(initializer_list<T> il)
{
    for (T i : il)
    {
        cout << "initializer list\n" ;
        insertAsLast(i);
    }
}

template <typename T>
template <typename X>
ListNode<T> * List<T>::insertAsLast(X && e)
{
    cout << "as last\n";
    ++_size; return trailer->insertAsPrev(std::forward<X>(e));
}

int main()
{
    List<int> = {1, 2, 3, 4, 2, 3, 1};
}

Вывод:

initializer list
as last
insert as prev
The terminal process terminated with exit code: 2816

Мой вопрос:

Кажется, что программа остановилась в операции new.
Что вызывает эту проблему?

Должен ли я использовать перегрузку для обработки ситуации lvalue и rvalue?

1 Ответ

1 голос
/ 12 апреля 2019

Ваш конструктор List не инициализирует элемент trailer, который вы используете в insertAsLast, что приводит к неопределенному поведению, что приводит к сбою.

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