代码之家  ›  专栏  ›  技术社区  ›  a_familiar_wolf

使用cmake编译而不使用cout时出现分段错误

  •  0
  • a_familiar_wolf  · 技术社区  · 7 年前

    我正在尝试创建对象列表(不使用 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);
        }
    }
    

    怎么会是这样?

    很抱歉代码太长,但我找不到任何要删除的部分,除非出现分段错误并保留程序的意义。 谢谢你的每一点帮助!

    1 回复  |  直到 7 年前
        1
  •  1
  •   3CxEZiVlQ    7 年前

    您不初始化 first last 具有 nullptr 在构造函数中。

    存储指向本地对象的指针 temp ,他们的生命受到 push_back 出口你有悬空的指针和UB。

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