我一直在 C++ 项目中对此进行编码,通常我不会遇到太大的分段错误问题,但我是 C++ 新手。基本上我正在创建一个指向 IntList 的指针,并调用 prepend() 从指针创建一个 IntList 。问题是,当调用 prepend 时,它会卡在头文件中的某个位置,然后退出。我不知道是什么原因造成的,gdb 告诉我它只是卡在标题处。非常感谢您的帮助,例如关于我做错了什么的提示或线索。谢谢。
IntList.h:
#ifndef _INTLIST_H
#define _INTLIST_H
#include <string>
#include <cstring>
using namespace std;
class EmptyIntList;
class IntList
{
public:
static IntList *emptyList();
//static IntList *fromString(string s);
virtual bool isEmpty();
IntList *prepend(int n);
virtual int head();
virtual IntList *tail();
string toString();
// virtual int length();
// virtual IntList *append(IntList *lst);
// virtual int operator[](int n);
// virtual ~IntList();
protected:
IntList();
IntList(IntList &);
// const IntList &operator=(const IntList &);
private:
int data;
IntList *rest;
};
IntList *operator+(IntList &lst1, IntList &lst2);
ostream &operator<<(ostream &outStream, IntList *lst);
ostream &operator<<(ostream &outStream, IntList &lst);
#endif
IntList.cpp:
#include "IntList.h"
#include "EmptyIntList.h"
#include <sstream>
IntList::IntList(){}
IntList *IntList::emptyList(){
return ( (IntList*)EmptyIntList::emptyList() );
}
bool IntList::isEmpty(){
return false;
}
IntList *IntList::prepend(int n){
IntList *x;
IntList y;
*x = y;
y.data = n ;
y.rest = x ;
return x;
}
int IntList::head(){
return data;
}
IntList *IntList::tail(){
return rest;
}
测试IntList.cpp:
int main()
{
int n;
IntList *x;
n=6;
x->prepend(n);
// cout << x->toString();
return 0;
}
gdb 一步一步:
8 int main()
(gdb) step
12 n=6;
(gdb)
14 x->prepend(n);
(gdb)
IntList::prepend (this=0x0, n=6) at IntList.cpp:30
30 IntList y;
(gdb)
IntList (this=0x7fff93ecb3c0) at IntList.cpp:12
12 IntList::IntList(){}
(gdb)
IntList::prepend (this=0x0, n=6) at IntList.cpp:32
32 *x = y;
(gdb)
IntList::operator= (this=0x401650) at IntList.h:18
18 {
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x0000000000401361 in IntList::operator= (this=0x401650) at IntList.h:18
18 {