Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;指针回溯的分段错误_C++_Pointers_Linked List_Segmentation Fault - Fatal编程技术网

C++ C++;指针回溯的分段错误

C++ C++;指针回溯的分段错误,c++,pointers,linked-list,segmentation-fault,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::

我现在得到一个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();
}

DeckOps::DeckOps
中,行

deck->insertRear(card);
可能是SEG故障的原因
deck
是一个指针,但您从未将其初始化为任何对象(如
deck=new dlist
或任何对象),因此它指向内存中的随机位置(或初始化为
0
,具体取决于您的编译器),并且您正在尝试使用它指向的随机内存(或者取消对
NULL
指针的引用,同样取决于编译器),导致segfault。您需要在构造函数顶部执行此操作,然后才能使用它


如果您修复了该问题,但它仍然存在segfault,那么它首先会出现多个问题,可能在
dlist
代码中的某个地方。

DeckOps::DeckOps
中,行

deck->insertRear(card);
可能是导致segfault的原因。
deck
是一个指针,但您从未将其初始化为任何对象(如
deck=new dlist
或任何对象),因此它指向内存中的随机位置(或初始化为
0
,具体取决于您的编译器),并且您正在尝试使用它指向的随机内存(或者取消对
NULL
指针的引用,同样取决于编译器),导致segfault。您需要在构造函数顶部执行此操作,然后才能使用它


如果您修复了该问题,但它仍然有一个segfault,那么它首先有多个问题,可能在
dlist
代码中的某个地方。

与您的问题无关,但为什么要创建这样的对象:
DeckOps*deck=new DeckOps(文件名);
为什么不
DeckOps deck(文件名)我不同意java,我同意尼尔的观点,尽量少用< C++ >新的<代码>。它会给你一个速度增加,而不是手动内存管理。我是这样学习的,我试过你说要做它,但它不起作用。与你的问题无关,但是为什么要创建这样的对象:<代码> Dekops*Cald=新Dekops:(文件名);
为什么不
DeckOps甲板(文件名)我不同意java,我同意尼尔的观点,尽量少用< C++ >新的<代码>。它会给你增加速度,而不是手动内存管理。我是这样学习的,我试过你说要做,但这不是工作。不知道是怎么回事!谢谢!我应该意识到我忘记了。现在我需要知道是否有一个我可以选择链接列表的整个部分,并将其与另一部分交换。@adsderek这应该像操作3个指针一样简单。如果通过单击此答案左上角两个箭头下方的复选标记解决了您的问题,请将此答案标记为答案。是否要详细说明?我不太确定从何处开始解决这个问题。我的一个想法是在我的list类中创建一个函数,可以选择一系列linknodes,比如我需要一个特定类下面的所有节点,以及另一个特定类上面的所有节点来切换位置。如果我必须在另一个类前面输入它们,比如在后面的前面。我知道我需要一个find func选项,以及某种交换功能,如果它可以是通用的(交换一组链接节点,或仅交换一个链接节点)@阿德德里克这样看:要交换一个节点和另一个节点,基本上是这样做的,其中
pre->next
指向
n1
,你想交换
n1
n2
n1->next=n2->next;n2->next=n1;pre->->next=n2;
。如果你想交换两组节点(假设它们不重叠)然后你就把它们一视同仁。这幅图可能会有所帮助:你如何选择组取决于你。另外,正如你所说,实现你的
swap one with one
函数可能会很好,就像调用
swap two groups
函数一样,而组只是两个单独的节点。不,这就解决了它!谢谢!我应该我意识到我忘了这么做。现在我需要知道是否有一种方法可以选择我的链接列表的整个部分,并将其与另一部分交换。@adsderek这应该像操作3个指针一样简单。如果通过单击左上方两个箭头下方的复选标记解决了您的问题,请将此答案标记为答案我不知道从哪里开始解决这个问题。我的想法是在我的列表类中创建一个函数,可以选择一系列链接节点,比如我需要一个特定节点下面的所有节点,以及另一个特定节点上面的所有节点来切换位置。如果我必须在前面输入它们,该怎么办另一个,就在后面的前面。我知道我需要一个查找函数和某种交换函数,如果它是通用的(交换一组链接节点,或者只是一个与另一个链接节点交换)@阿德德里克这样看:要交换一个节点和另一个节点,基本上是这样做的,其中
pre->next
指向
n1
,你想交换
n1
n2
n1->next=n2->next;n2->next=n1;pre->->next=n2;
。如果你想交换两组节点(假设它们不重叠)然后,您就可以对它们一视同仁。下面的图片可能会有所帮助:您如何选择组取决于您。此外,正如您所说,实现
swap one with one
函数作为对
swap two groups
函数的调用可能会很好,因为组只是两个单独的节点。