分段错误,用cmake编译而没有cout

时间:2018-01-23 18:01:43

标签: c++ cmake cout clang++

我试图制作一个包含指向下一个和前一个对象的指针的对象列表(不使用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错误并保持对程序的理解。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您没有在构造函数中使用first初始化lastnullptr

您存储指向本地对象temp的指针,它们的生命受到push_back退出的限制。你有悬挂的指针和UB。

这就是为什么STL存在并且必须使用的原因。它由最好的C ++专业人员开发并经过充分测试。