扔不正常

时间:2013-11-10 03:53:42

标签: c++ arrays templates c++11

我声明数组的大小为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;
}

2 个答案:

答案 0 :(得分:3)

每次插入内容时,都要检查大小变量,然后再增加它。当你达到size == N时,没有任何反应。你只需要走出数组边界,你需要考虑大小即将变得大于数组的情况。

答案 1 :(得分:0)

您使用的是STL吗?如果是,请尝试使用vector<T>::at安全方法,该方法将为您执行所有必要的检查,并在超出其范围时抛出std::out_of_range异常。