转发参考错误时终端进程终止

时间:2019-04-12 05:24:04

标签: c++ templates

我正在尝试写一个列表。我使用forwarding reference来处理lvaluervalue。但是在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操作中停止了。
是什么导致此问题?

我应该使用重载来处理左值和右值情况吗?

1 个答案:

答案 0 :(得分:1)

您的List构造函数不会初始化您在trailer中使用的insertAsLast成员,这会导致未定义的行为,从而导致崩溃。

相关问题