C++ 我能';我不明白为什么我';我的代码中有一个seg错误
所以我有这个C++ 我能';我不明白为什么我';我的代码中有一个seg错误,c++,segmentation-fault,C++,Segmentation Fault,所以我有这个 void MovieGroup::add(Movie* m) { cout << "Size = " << size << endl; if(size < MAX_COLLECTION){ if(size == 0){ collection[0] = m; } else{ for(int i = 0; i<size; i++){ if(collection[
void MovieGroup::add(Movie* m)
{
cout << "Size = " << size << endl;
if(size < MAX_COLLECTION){
if(size == 0){
collection[0] = m;
}
else{
for(int i = 0; i<size; i++){
if(collection[i]->getYear() >= m->getYear()){
for(int j = size-1; j != i; j--){
collection[j] = collection[j-1];
}
collection[i] = m;
break;
}
else{
collection[size] = m;
}
}
}
size++;
}
}
void MovieGroup::add(Movie*m)
{
cout行collection[size]=m;
位于错误的位置。它需要在循环之外
此外,当您四处移动元素时,会丢失一些元素,因为您没有将它们全部移动,因此最终会覆盖其中的一些元素
此外,在移动元素后,应使用return
而不是break
,否则必须跟踪循环是否移动,以便循环后的代码可以相应地执行操作
请尝试以下方法:
void MovieGroup::add(Movie*m)
{
cout getYear()){
对于(int j=size-1;j>=i;--j){
集合[j+1]=集合[j];
}
集合[i]=m;
++大小;
返回;
}
}
集合[大小]=m;
++大小;
}
}
话虽如此,我将进一步调整函数,使插入和增量仅为1点,而不是2点:
void MovieGroup::add(Movie*m)
{
cout getYear()){
对于(int j=size-1;j>=i;--j){
集合[j+1]=集合[j];
}
指数=i;
打破
}
}
集合[索引]=m;
++大小;
}
}
然后,我建议使用标准算法,而不是手动操作:
#包括
#包括
作废电影组::添加(电影*m)
{
cout getYear();}
);
如果(iter!=收集结束){
std::向后复制(iter,收集结束,收集结束+1);
}
*iter=m;
++大小;
}
}
最后,您可能需要考虑将<代码>集合<代码>更改为<代码> STD::vector < /COD>而不是固定长度数组,然后可以使用<代码> STD::Vector::插入()/<代码>,不必担心手动转换元素或跟踪<代码>大小<代码>:
#包括
作废电影组::添加(电影*m)
{
cout getYear();}
);
收集.插入(国际热核实验堆,m);
}
调试器说分段错误发生在哪里?这可能会给你一个线索。行集合[size]=m
看起来可疑。要包含a的问题:对MovieGroup
类的部分定义,包括构造函数和collection
和size
成员变量。这太棒了!我唯一要添加的是返回之前的size+。编辑:刚刚刷新了我的页面,看到你们已经说lolSo我在返回之前添加了size+,它给了我另一个错误。但是如果我删除它,它会工作,但无法正确跟踪大小。无论是将m
插入移位的插槽还是结束插槽,您都必须增加大小