来自指针回溯的C ++分段错误

时间:2011-05-20 21:55:39

标签: c++ pointers linked-list segmentation-fault

我目前正在遇到一个seg错误,并且从我认为是主要的一行开始,在gdb中进行回溯之后,我基本上可以找到它,但我不确定需要改变什么。这是我按顺序看到的地方:

首先是主要的:

DeckOps *deck = new DeckOps(filename);

我相信是引起它的行,回溯还包括

class DeckOps{
 public:
  DeckOps(string filename);
  ~DeckOps();

 private:
  dlist *deck;
}

然后是.cpp文件

DeckOps::DeckOps(string filename){

  ifstream inF;

  inF.open(filename.c_str());

  if (inF.fail()){
    cerr << "Error opening file" << endl;
    exit(1);
  }
  int deckcount = 28;
  int card;
  for(int i = 0; i <= deckcount; i++){
    inF >> card;
    deck->insertRear(card);
  }
  inF.close();
}

然后最后一个地方

void dlist::insertRear(int d){
  LinkNode *link = new LinkNode();
  int *nd = new int();
  *nd = d;
  link->data= nd;

  if(first == 0){
    first = last = link;
    return;
  }
  last->next = link;
  link->prev = last;
  last = link;
}

1 个答案:

答案 0 :(得分:6)

DeckOps::DeckOps中,

deck->insertRear(card);

可能导致段错误。 deck是一个指针,但你永远不会将其初始化为任何东西(如deck = new dlist或其他),因此它指向内存中的随机位置(或根据您的编译器初始化为0)和你试图使用它指向的随机内存(或取消引用NULL指针,同样取决于你的编译器),导致段错误。在使用它之前,您需要在构造函数的顶部执行此操作。

如果你修复了它并且它仍然存在段错误,那么它首先会出现多个问题,可能是dlist代码中的某个地方。