【问题标题】:C++ Segmentation fault from pointer backtrace来自指针回溯的 C++ 分段错误
【发布时间】:2011-05-20 21:55:38
【问题描述】:

我目前遇到一个段错误,它从我认为是 main 中的一行开始,在 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;
}

【问题讨论】:

  • 与您的问题无关,但为什么要创建这样的对象:DeckOps *deck = new DeckOps(filename); 为什么不DeckOps deck(filename); - C++ 不是 Java。
  • 我同意尼尔的观点,尽量少用new。它将为您提供速度提升,并且无需手动管理内存。
  • 这就是我学习的方式,我试过你说要这样做,但没有用。

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


【解决方案1】:

DeckOps::DeckOps,一行

deck->insertRear(card);

可能是导致段错误的原因。 deck 是一个指针,但你从不将它初始化为任何东西(如 deck = new dlist 或其他任何东西),因此它指向内存中的随机位置(或根据你的编译器初始化为 0)并且你正在尝试使用它指向的随机内存(或取消引用NULL 指针,再次取决于您的编译器),导致段错误。您需要在构造函数的顶部执行此操作,然后才能使用它。

如果你解决了这个问题,但它仍然有段错误,那么它一开始就有多个问题,可能在 dlist 代码的某个地方。

【讨论】:

  • 不,修复它!谢谢!我应该意识到我忘了这样做。现在我需要知道是否有一种方法可以选择我的链表的整个部分,并将其与另一个部分交换。
  • @adsderek 应该像操作 3 个指针一样简单。如果通过单击此答案左上角两个箭头下方的复选标记解决了您的问题,请将此答案标记为答案。
  • 您愿意详细说明吗?我不确定从哪里开始解决这个问题。我的一个想法是在我的列表类中创建一个函数,该函数可以选择一系列链接节点,比如我需要特定节点下方的所有节点,以及另一个特定节点上方的所有节点来切换位置。如果我必须在另一个前面输入它们怎么办,说就在后面。
  • 我知道我需要一个查找功能和某种交换功能,如果它可以是通用的(交换一组链接节点,或者只是一个与另一个)
  • @adsderek 这样看:要将一个节点与另一个交换,您基本上是这样做的,其中pre-&gt;next 指向n1,并且您想将n1n2 交换: n1-&gt;next = n2-&gt;next; n2-&gt;next = n1; pre-&gt;next = n2;。因此,如果您想交换两组节点(假设它们不重叠),那么您只需将它们视为相同。这是一张可能会有所帮助的图片:i.imgur.com/p9jtc.png 如何选择群组取决于您。此外,正如您所说,最好将您的 swap-one-with-one 函数实现为对 swap-two-groups 函数的调用,其中组只是两个单个节点。
猜你喜欢
  • 1970-01-01
  • 2013-09-18
  • 2016-02-24
  • 2018-07-29
  • 1970-01-01
  • 2012-04-10
  • 2021-05-25
  • 2016-01-02
  • 2021-04-10
相关资源
最近更新 更多