Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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++ 损坏的双链接列表:0x0804d0c0(C+;+;)?_C++_Arrays_Oop_Loops_Sigabrt - Fatal编程技术网

C++ 损坏的双链接列表:0x0804d0c0(C+;+;)?

C++ 损坏的双链接列表:0x0804d0c0(C+;+;)?,c++,arrays,oop,loops,sigabrt,C++,Arrays,Oop,Loops,Sigabrt,注意:我以前从来没有遇到过这种规模的问题,也不知道如何布局,如果我布局错误,请解释我应该如何布局。如果你不能或不愿意帮助这个项目,我很高兴了解这个问题 我一直在写一段代码来练习面向对象编程,但我遇到了一个我从未见过的错误(我在这方面只做了几个月,没有太多时间学习,因为我的时间浪费在了义务教育上)。内核本身(显然)在我的代码中产生了这个错误。但是运行gdb(带有调试符号)并没有给我一个行号的概念。输入printf语句表明它在while循环中循环,即使条件不再满足?这对我来说似乎很奇怪,因为它似乎没

注意:我以前从来没有遇到过这种规模的问题,也不知道如何布局,如果我布局错误,请解释我应该如何布局。如果你不能或不愿意帮助这个项目,我很高兴了解这个问题

我一直在写一段代码来练习面向对象编程,但我遇到了一个我从未见过的错误(我在这方面只做了几个月,没有太多时间学习,因为我的时间浪费在了义务教育上)。内核本身(显然)在我的代码中产生了这个错误。但是运行gdb(带有调试符号)并没有给我一个行号的概念。输入printf语句表明它在while循环中循环,即使条件不再满足?这对我来说似乎很奇怪,因为它似乎没有满足条件,但它仍在循环。当这种情况发生时,它之所以会出错(我认为),是因为在“Stack”类的某个地方,它为整数数组重新分配了负大小的内存——尽管当我向Stack::reloc添加if语句以防止它重新分配负数组大小时,它仍然会出错。向下看,它显示了其他几条信息(引用gdb):

程序收到信号SIGABRT,中止。 0x0012d422在内核vsyscall()中

我并没有从SIGABRT的维基页面学到很多东西,我也不认为十六进制数字对我来说意味着什么。这是我的代码,分为两个类和主类:

标题:

#include <cstdio>
#include <cstdlib>

一个大问题是,realloc()行应该是:

stack = realloc(stack, (size+diff));

由于内存损坏,您的程序行为异常并崩溃


在您的情况下,这可能是由于通过无效指针进行写入造成的。由于代码中唯一直接使用指针的部分是
堆栈
类,因此可能是
堆栈
有缺陷,或者
宇宙
有缺陷导致
堆栈
被错误使用。

标准库已经提供了堆栈实现,所以我不明白你为什么要实现你自己的。您的问题是没有提供析构函数、复制构造函数或复制赋值运算符。调用析构函数时,它将释放指针,但不会释放指向的对象。这将导致内存泄漏。类似地,当调用复制构造函数或赋值运算符时,它将复制指针,而不是它指向的对象。如果正确定义了析构函数,但没有定义复制函数,那么如果对象被复制(不正确),则可能会删除不存在的对象

另一个问题是您使用的
realloc
不正确。它应该是:

stack = realloc(stack, (size + diff) * sizeof(int));
这是在分配位置发生变化的情况下。编辑:多亏了另一个答案的评论,我注意到的另一件事是,您必须将大小乘以
sizeof(int)
,因为它需要以字节为单位的大小


上述问题并不是程序无限循环的原因,但值得一提。真正的问题是循环。您希望在
top
小于或等于0(或在一种情况下小于1)时执行循环。实际上,当
top
大于0时应该是这样,因为0表示堆栈中没有更多的元素。由于允许堆栈访问索引小于0的元素,因此会出现错误。看起来循环只能满足它们的条件一次,所以您可以删除它们。

在程序中的某个地方,您试图使用无效指针。内存损坏很难找到,特别是对于初学者。引用Brian Kernighan的话:“当你尽力编写代码时,你将如何调试它?”GDB可以在复杂的程序中帮助你,但在这种情况下,我会转向另一个方向

幸运的是,
Stack
似乎是程序中唯一处理内存的地方。 我的建议是在其方法中加入一些断言,如下所示:

// at the beginning of pop():
  assert(top > 1);
这将帮助您在代码的其他部分中发现错误,这些错误正在误用堆栈类:

while (y_pos.top<=0) {
  yp = y_pos.pop();

while(y_pos.top)很难在这么多代码中发现错误。为了您自己和我们的利益,您应该尽可能多地删除代码而不删除错误。
Universe::move()中的计算
,例如,可能与错误无关。请尝试删除可能与错误无关的代码,编译、运行并重复,只要您仍然可以看到错误。最后留下的内容应该可以揭示原因:)问题标题似乎有误导性。我在您的代码中没有看到双链接列表。@这是来自GDB的错误,可能是内存错误。用户还可以使用调试符号进行编译吗?看起来你不是这样的gdb只是给出地址而不是符号名我承认写你自己的堆栈是一个编程练习,但让我问一下-你是否也知道
std::Stack
std::vector
std::list
?我同意Jesus Ramos的观点。您似乎没有使用调试符号编译程序。将-g添加到编译器命令行。在运行应用程序之前,请在控制台中执行“ulimit-c unlimited”,以便应用程序在崩溃时生成核心转储。然后,您可以在gdb中打开它,并查看出了什么问题。
stack=realloc(stack,(size+diff)*sizeof(int))谢谢,我应该使用它(看看我是如何在Stack::Stack中使用malloc的),我还需要指定它需要和整数数组:Stack=(int*)realloc(Stack,(size+diff)*sizeof(int));
stack = realloc(stack, (size+diff));
stack = realloc(stack, (size + diff) * sizeof(int));
// at the beginning of pop():
  assert(top > 1);
while (y_pos.top<=0) {
  yp = y_pos.pop();