0

このコードが実行される理由、VC ++は範囲外の例外を表示しますか?

エラーメッセージ:vector Line:933 Expression: "Standard C ++ Libraries Out of Range" && 0

highは、イテレータの最上位の要素を返す関数です。次に、配列とベクトルを作成し、highを使用してそれらの中で最も高い要素を見つけます。

これはiterator.hです。

template<class Iterator> Iterator high(Iterator first, Iterator last)
{
    Iterator high = first;
    for(Iterator p = first; p != last; ++p)
        if(*high < *p) high = p;
    return high;
}

これが主な機能です。

#include <iostream>
#include <vector>
#include "iterator.h"

using namespace std;

double* get_from_jack(int* count)
{
    double* p = new double[5];
    p[0] = 2.3;
    p[1] = 3.1;
    p[2] = 2.1;
    p[3] = 1.2;
    p[4] = 4.3;
    *count = 5;
    return p;
}

vector<double>* get_from_jill()
{
    vector<double> v;
    v.push_back(2.1);
    v.push_back(3.8);
    v.push_back(5.1);
    v.push_back(2.2);
    v.push_back(1.9);
    v.push_back(4.4);
    vector<double>* p = &v;
    return p;
}

void fct()
{
    int jack_count = 0;
    double* jack_data = get_from_jack(&jack_count);
    vector<double>* jill_data = get_from_jill();

    double* jack_high = high(jack_data, jack_data+jack_count);
    vector<double>& v = *jill_data;
    double* jill_high = high( &v[0], &v[0]+v.size() );

    cout << "Jill's high " << *jill_high << "; Jack's high " << *jack_high;

    delete[] jack_data;
    delete jill_data;
    //delete jack_high;
    //delete jill_high;
}

int main()
{
    try{
        fct();
        int n;
        cin >> n;
        return 0;
    }
    catch(exception&e)
    {
        cerr << e.what();
        return 1;
    }
    catch(...)
    {
        return 2;
    }
}
4

1 に答える 1

1

get_from_jill()関数が終了すると、存在しなくなったポインタへのベクトルを返します。配列で行ったように、ヒープでベクターをインスタンス化するか、そのコピーを返す必要があります。私は後者を好みます。コードがより簡潔になります。

于 2012-10-17T00:34:21.800 に答える