【问题标题】:What is the source of this segmentation fault?这种分段错误的根源是什么?
【发布时间】:2011-10-23 21:22:48
【问题描述】:

我在这里遇到了一个奇怪的错误:882 Segmentation fault ./a.out

代码段:

int end=array.Length, loop=0;
cout<<end<<" about to print";
for(;loop<end;loop++){
    cout<<"\nMr. loop says: ";
    array.get(loop).print(fout);
}

我的程序的输出:

enpty initializer called for llist
enpty initializer called for entry
adding
adding
999deleting999
done deleting
123deleting123
done deleting
333deleting333
done deleting
printing
2 about to print
./g+: line 7:   882 Segmentation fault      ./a.out

和重要输出:

printing
2 about to print
./g+: line 7:   882 Segmentation fault      ./a.out

表示错误是这一行:

for(;loop<end;loop++){

它已被证明具有良好的价值并且在语法上是正确的(是的,我知道它的糟糕风格)。

想法?我的大学里似乎没有人能帮我解决这个问题。

这里是文件:

【问题讨论】:

  • “我的大学里似乎没有人能帮我解决这个问题”.. 某所大学!!
  • @Josh 你是学生还是老师?如果是学生,您可能应该将此问题标记为homework。如果是一名教师,您可能需要考虑转到一所大学,那里的 cs 系有人知道什么是分段错误。
  • 很抱歉给您带来麻烦。我会 rtfm。
  • endl放在你所有的couts之后,比如cout&lt;&lt;end&lt;&lt;" about to print"&lt;&lt; endl;。这将刷新程序崩溃时不会刷新的缓冲区。
  • @Josh:抱歉,您可能错过了我的最后一条评论:请不要要求人们访问外部网站以获取有关您问题的基本详细信息。 stackoverflow.com 上的问题应该是自包含的。

标签: c++ pointers g++ segmentation-fault


【解决方案1】:

除非您正在执行低级内存操作(并且您没有在发布的程序中执行此操作),否则segmentation fault 是内存损坏的标志,即您搞砸了一些编码。请注意,内存损坏通常发生在触发错误之前。在极端情况下,初始内存损坏和实际分段错误可能相隔数小时和模块。

您的第一步应该是在 valgrind 或 gdb 中运行程序以找出分段错误的详细信息。此外,始终至少使用 gcc -Wall 进行编译并注意每个警告 - 除非您正在修改编译器,否则更改是每个警告都表明存在错误。

在您的情况下,错误几乎肯定是在llist 的实现中。该实现存在许多问题:

  • 实现不属于 .h 文件,它们应该在 .cpp 文件中。
  • entry.towardsbackentry.towardsfront 通常称为 prev(ious) 和 next - 这些名称更短且更易于区分。
  • 根据链表的一般命名约定,hold 可能应该称为 head
  • 长度为 0 的列表不应包含任何条目,即使用 hold == NULL 初始化。
  • 从第 61 行(add):

hold->towardsback = node;
hold->towardsback->towardshead = node; // node->towardshead = node;

第二行几乎肯定是错误的。您可能想先配置node,然后再设置hold-&gt;towardsback = node;

【讨论】:

  • Dani 也需要一些积分。它在下一行。
  • 好的,听起来不错。我会做出改变。当有人告诉我我做错了什么时,它会有所帮助。
  • 除非它解决了您的问题,否则您不应将此答案标记为已接受(如果您觉得它有帮助,您可以投票)。我认为 Moo-Juice 比我更接近解决方案。
  • 对于第二部分,其他一些代码是用来处理环形结构的,所以我认为那部分不会起作用。在初始化场景中,没有形成环。
  • @phihag 我没有问我的程序有什么问题,只是为什么我得到了一个奇怪的错误。这个人就是这么做的。非常感谢现在以外的任何事情,但超出了我的问题范围。
【解决方案2】:

这很可能是因为您管理列表的方式。您正在添加/删除动态分配的对象,并通过引用传递它们。这是个坏主意。

【讨论】:

    【解决方案3】:

    好的,粗略浏览一下您的代码,我发现了几个问题。

    1. 在你的条目中类

      operator T* () {return &stud;}
      

    stud 已经是 T*。您现在返回的是该指针的地址,而不是指针本身。

    1. 在你的llist 班级中

      if(temp==temp->towardsback){
              delete this;
      

    如果此条件为真,这实际上会删除您的列表类。哎哟?

    就个人而言,我认为你需要重新开始你的列表实施:)

    【讨论】:

    • 我在这里自学。为我在 10 年级免费上的课程付费。我正在努力!
    • @Josh,坚持下去,伙计,我相信你会破解的 :)
    • 一位教授在经过 5 个学期的编程,其中 3 个使用 c++ 后,只是说“哦,有一个东西叫做继承”——这令人沮丧……
    【解决方案4】:

    我主要使用 c#,但数组 0 在 c++ 中是索引吗?因此,您需要将 end 设置为 array.Length-1。至少在 C# 中,数组中的第一个元素是 array[0]。

    【讨论】:

    • loop&lt;end 表示不超过返回的长度。
    • 他的for循环对数组长度的作用小于,所以他不需要length - 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2021-07-12
    相关资源
    最近更新 更多