这个分段错误的来源是什么?

时间:2011-10-23 21:22:49

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

我在这里遇到了一个奇怪的错误: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++){

已经证明了良好的价值并且在语法上是正确的(是的,我知道它的风格不好)。

想法?我大学的任何人似乎都无法帮助我。

这是文件:

4 个答案:

答案 0 :(得分:3)

除非您正在执行低级别的内存操作(并且您在发布的程序中没有这样做),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->towardsback = node;

答案 1 :(得分:1)

最有可能的原因是你如何管理你的清单。您正在添加/删除动态分配的对象,并通过引用传递它们。这是一个坏主意。

答案 2 :(得分:1)

好的,我看到了几个问题,粗略地看了一下你的代码。

  1. 在您的条目&lt;&gt;类

    operator T* () {return &stud;}
    
  2. stud已经是T *了。您现在返回该指针的地址,而不是指针本身。

    1. llist班级

      if(temp==temp->towardsback){
              delete this;
      
    2. 如果此条件为真,那么实际上将删除列表类。哎哟?

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

答案 3 :(得分:0)

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