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
插入移位的插槽还是结束插槽,您都必须增加
大小