我声明数组的大小为2,我尝试插入第3个数组位置。当位置>时,插入函数应该抛出-1。 size + 1(在将元素分配到数组时使用pos-1)但是throw没有停止第3个数组位置的赋值,因此我遇到了分段错误。
template <class T, int N>
class person : public people<T>
{
private:
T a[N];
int size;
public:
person();
virtual void insert(int pos, T info);
virtual T show(int pos);
};
template<class T, int N>
person<T,N>::person(){
size = 0;
}
template <class T, int N>
void person<T,N>::insert(int pos, T info){
if (pos <= 0 || pos > size+1)
throw -1;
a[pos-1] = info;
++size;
}
template <class T, int N>
T person<T,N>::show(int pos){
if ( pos <= 0 || pos > size+1 )
throw -1;
return a[pos-1];
}
void putin( people<name>*& aPerson ) {//passing aPerson itself
string first("Julia"), last("Robert");
name temp(first, last);
string ft("Delilah"), lt("McLuvin");
name temp2(ft, lt);
string fst("oooh lala"), lst("broomdat");
name temp3(fst, lst);
try{
aPerson-> insert(1,temp);
aPerson-> insert(2,temp2);
aPerson-> insert(3,temp3);
}
catch(...){ cout<< "error\n";}
}
int main(){
people<name>* aPerson = new person<name, 2>();
putin(aPerson);
try{
cout << aPerson->show(1);
cout << aPerson->show(2);
cout << aPerson->show(3);
}
catch(...){ cout<< "error\n";}
return 0;
}
答案 0 :(得分:3)
每次插入内容时,都要检查大小变量,然后再增加它。当你达到size == N时,没有任何反应。你只需要走出数组边界,你需要考虑大小即将变得大于数组的情况。
答案 1 :(得分:0)
您使用的是STL吗?如果是,请尝试使用vector<T>::at
安全方法,该方法将为您执行所有必要的检查,并在超出其范围时抛出std::out_of_range
异常。