c++ - 转发参考错误时终端进程终止
问题描述
我正在尝试写一个列表。我曾经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
运行。
是什么导致了这个问题?
我应该使用重载来处理左值和右值的情况吗?
解决方案
您的List
构造函数不会初始化trailer
您正在使用的成员,insertAsLast
这会导致未定义的行为,从而导致崩溃。
推荐阅读
- bash - 仅在 IP 更改时通知
- javascript - 如何等到承诺完成后再开始 JavaScript 中“无限”for 循环的下一次迭代
- reactjs - 有没有办法使用 Yup 模式要求基于另一个字段的字段?
- c++ - 使用 wcin 的非拉丁输入产生字符 '/0'
- python - 关于 kivy.uix.widget.WidgetException 的问题
- ionic5 - 如何扩展 ion-loading 直到页面在 ionic-5 中呈现
- python - 电报机器人。如果用户使用测试消息,则推动用户使用按钮
- realm - 如何在后台线程中插入 Realm DB 中的大 api 响应并更新表视图 ui?
- python - 使用不同算法循环回归训练数据集
- angular - ng2-charts (chart.js) 条形图列无法呈现超过一定宽度