分段错误,当使用 cmake 编译时没有 cout
Segmentation fault, when compiled with cmake and without cout
我正在尝试创建一个对象列表(不使用 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);
}
}
怎么会这样?
很抱歉代码太长了,但我找不到任何要删除的部分而不会出现分段错误并保持程序的意义。
感谢您的每一点帮助!
您没有在构造函数中使用 nullptr
初始化 first
和 last
。
您存储指向本地对象的指针 temp
,它们的寿命受 push_back
退出限制。你有悬挂指针和 UB。
这就是 STL 存在并且必须使用的原因。它由最优秀的 C++ 专业人士开发并经过良好测试。
我正在尝试创建一个对象列表(不使用 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);
}
}
怎么会这样?
很抱歉代码太长了,但我找不到任何要删除的部分而不会出现分段错误并保持程序的意义。 感谢您的每一点帮助!
您没有在构造函数中使用 nullptr
初始化 first
和 last
。
您存储指向本地对象的指针 temp
,它们的寿命受 push_back
退出限制。你有悬挂指针和 UB。
这就是 STL 存在并且必须使用的原因。它由最优秀的 C++ 专业人士开发并经过良好测试。