c++ - 段错误,当使用 cmake 编译时没有 cout

标签 c++ cmake cout clang++

我正在尝试创建一个对象列表(不使用 std::list),其中包含指向下一个和上一个对象的指针。出于某种原因,以下代码抛出段错误,但是当我注释掉 std::cout 时,代码不会抛出段错误,并且当我不使用 cmake 编译时,而是使用铛++。在这两种情况下,我都使用 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);
    }
}

怎么会这样呢?

我很抱歉代码太长了,但是我找不到任何要删除的部分而不会出现段错误并保持程序的意义。 感谢您提供的每一点帮助!

最佳答案

您没有在构造函数中使用 nullptr 初始化 firstlast

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

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

关于c++ - 段错误,当使用 cmake 编译时没有 cout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48408093/

相关文章:

c++ - 如何使用带有一个填充空间的 std:out setfill std::setw std:right 格式化文本

c++ - 对于 char d,我在执行 cout << &d 时得到奇怪的输出

c++ - 访问C中的数组元素

java - 设计模式 : Elements of Reusable Object-Oriented Software

c++ - 初始化相互引用的对象

c++ - 将 armadillo/blas/lapack 与 cmake 链接(对 `dgemv_' 的 undefined reference )

c++ - OpenCV_FOUND 为 FALSE,因此包 "OpenCV"被认为未找到

c++ - Qt 和 native 菜单

c++ - 使用 CLion/CMake/MSVC 2015 编译 WIN32 应用程序时出现链接错误

c++ - 非常简单的 c++ for 语句,但它不会计算出来?