我正在尝试列出包含指向下一个和上一个对象的指针的对象列表(不使用std::list
)。由于某种原因,以下代码将引发分段错误,但是当我注释掉std::cout
时,代码将不会引发分段错误,并且当我不使用cmake进行编译时,也不会使用clang ++进行编译。在这两种情况下,我都使用C ++ 14。
#include <iostream>
class myListElement
{
myListElement *next;
double val;
public:
myListElement(int entry, myListElement *newPrev):val(entry), prev(newPrev){}
void setNext(myListElement *newPrev){prev = newPrev;}
};
class myList
{
myListElement *first,*last;
public:
myList(){}
~myList(){}
void push_back(int entry)
{
myListElement temp(entry,last);
if(last != nullptr)
{
last->setNext(&temp);
}
}
};
int main()
{
int n = 1000;
myList my_list;
//std::cout << "\ntest";
for(int i = 0; i < n; ++i)
{
my_list.push_back(i+1);
}
}
怎么会这样呢?
对于冗长的代码,我感到抱歉,但是在找不到Segmentation错误并保持程序含义的情况下,我找不到要删除的任何部分。
多谢您的协助!
最佳答案
您不要在构造函数中使用first
初始化last
和nullptr
。
您存储指向本地对象temp
的指针,它们的生命受到push_back
出口的限制。您有悬空的指针和UB。
这就是为什么必须存在STL的原因。它是由最好的C ++专业人士开发并经过充分测试的。