我在这里遇到了一个奇怪的错误: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++){
已经证明了良好的价值并且在语法上是正确的(是的,我知道它的风格不好)。
想法?我大学的任何人似乎都无法帮助我。
这是文件:
答案 0 :(得分:3)
除非您正在执行低级别的内存操作(并且您在发布的程序中没有这样做),segmentation fault表示内存损坏,即您已经搞砸了一些编码。请注意,内存损坏通常发生在触发错误之前。在极端情况下,初始内存损坏和实际分段故障可能是数小时和模块分开。
您的第一步应该是在valgrind或gdb中运行程序以找出分段错误的详细信息。此外,始终至少使用gcc -Wall
进行编译并记下每个警告 - 除非您正在修改编译器,否则更改是每个警告都会显示错误。
在您的情况下,错误几乎肯定是llist
的实现。该实现存在许多问题:
entry.towardsback
和entry.towardsfront
通常称为prev
(ious)和next
- 这些名称更短,更容易区分。hold
可能应该被称为head
。hold == NULL
初始化。add
中):
hold->towardsback = node;
hold->towardsback->towardshead = node; // node->towardshead = node;
第二行几乎肯定是错的。您可能希望先配置node
,然后再设置hold->towardsback = node;
。
答案 1 :(得分:1)
最有可能的原因是你如何管理你的清单。您正在添加/删除动态分配的对象,并通过引用传递它们。这是一个坏主意。
答案 2 :(得分:1)
好的,我看到了几个问题,粗略地看了一下你的代码。
在您的条目&lt;&gt;类
operator T* () {return &stud;}
stud
已经是T *了。您现在返回该指针的地址,而不是指针本身。
在llist
班级
if(temp==temp->towardsback){
delete this;
如果此条件为真,那么实际上将删除列表类。哎哟?
就个人而言,我认为您需要重新开始列表实施:)
答案 3 :(得分:0)
我主要使用c#,但是c ++中的数组0索引?因此,您需要将end设置为array.Length-1。至少在c#中,数组中的第一个元素是array [0]。