总是用 g++ 得到有趣的分段错误
Always getting interesting Segmentation Fault with g++
我正在做一个简单的链表项目,除 List class 析构函数外,一切正常。我试图删除列表中的每个节点,但 g++ 每次都会抛出分段错误(即使是空析构函数)。有人可以帮助我,我的代码有什么问题吗?谢谢!
我的清单header;
struct Node{
double data;
Node* next;
};
class List{
public:
List();
~List();
void insertF(double data);
void printList();
private:
Node* head;
Node* currNode;
};
列出源文件;
#include "List.h"
List::List(){
std::cout<<"Constructed Linked List";
}
void List::insertF(double dataX){
Node* nn = new Node;
if(!currNode){
head = nn;
nn->data=dataX;
currNode = nn;
}else{
currNode->next = nn;
nn->data = dataX;
currNode = nn;
}
}
void List::printList(){
Node* walker = head;
while(walker){
std::cout<<walker->data;
std::cout<<"----->";
walker = walker->next;
}
}
List::~List(){
Node* currNode = head, *nextNode = NULL;
while(currNode != NULL){
nextNode = currNode->next;
delete currNode;
currNode = nextNode;
}
std::cout<<"sd";
}
主要;
#include "List.h"
using namespace std;
int main(){
List list;
list.insertF(3.0);
list.insertF(4.0);
list.printList();
}
偶数;
List::~List(){
std::cout<<"sd";
}
抛出分段错误。列表总是填满所以我不检查头部是否为空
您还没有在任何地方初始化 currNode
,所以当您这样做时:
if(!currNode) {
第一次调用 insertF
时,currNode
的这种使用会调用未定义的行为。
您应该像这样初始化所有成员:
Node* head = nullptr;
Node* currNode = nullptr;
您在未初始化的情况下使用成员变量 head
和 currNode
的值调用了 未定义的行为。
像这样初始化它们:
List::List(){
head = nullptr; // add this
currNode = nullptr; // add this
std::cout<<"Constructed Linked List";
}
或者像这样:
List::List() : head(nullptr), currNode(nullptr) { // add member initialization list
std::cout<<"Constructed Linked List";
}
我正在做一个简单的链表项目,除 List class 析构函数外,一切正常。我试图删除列表中的每个节点,但 g++ 每次都会抛出分段错误(即使是空析构函数)。有人可以帮助我,我的代码有什么问题吗?谢谢!
我的清单header;
struct Node{
double data;
Node* next;
};
class List{
public:
List();
~List();
void insertF(double data);
void printList();
private:
Node* head;
Node* currNode;
};
列出源文件;
#include "List.h"
List::List(){
std::cout<<"Constructed Linked List";
}
void List::insertF(double dataX){
Node* nn = new Node;
if(!currNode){
head = nn;
nn->data=dataX;
currNode = nn;
}else{
currNode->next = nn;
nn->data = dataX;
currNode = nn;
}
}
void List::printList(){
Node* walker = head;
while(walker){
std::cout<<walker->data;
std::cout<<"----->";
walker = walker->next;
}
}
List::~List(){
Node* currNode = head, *nextNode = NULL;
while(currNode != NULL){
nextNode = currNode->next;
delete currNode;
currNode = nextNode;
}
std::cout<<"sd";
}
主要;
#include "List.h"
using namespace std;
int main(){
List list;
list.insertF(3.0);
list.insertF(4.0);
list.printList();
}
偶数;
List::~List(){
std::cout<<"sd";
}
抛出分段错误。列表总是填满所以我不检查头部是否为空
您还没有在任何地方初始化 currNode
,所以当您这样做时:
if(!currNode) {
第一次调用 insertF
时,currNode
的这种使用会调用未定义的行为。
您应该像这样初始化所有成员:
Node* head = nullptr;
Node* currNode = nullptr;
您在未初始化的情况下使用成员变量 head
和 currNode
的值调用了 未定义的行为。
像这样初始化它们:
List::List(){
head = nullptr; // add this
currNode = nullptr; // add this
std::cout<<"Constructed Linked List";
}
或者像这样:
List::List() : head(nullptr), currNode(nullptr) { // add member initialization list
std::cout<<"Constructed Linked List";
}