2

私は次のクラスを持っています:

template <typename T>
class matrix
{
private:
    int _n;
    T* array;
public:
    matrix(): _n(0) 
    {
        array = new T[_n * _n];
    }
    matrix(int n): _n(n)
    {
        if( n < 0 )
            throw "Invalid array size!";
        array = new T[_n * _n];
    }
    ~matrix()
    {
        delete[] array;
    }
    void Set(const int x, const int y,const T val)
    {
        if( ( x<0 || x>_n ) && ( y<0 || y>_n) )
            throw "Invalid index";
        array[x*_n + y] = val;
    }
    T& Get(const int x, const int y)
    {
        if( ( x<0 || x>_n ) && ( y<0 || y>_n) )
            throw "Invalid index";
        return array[x*_n + y];
    }
};

そしてそれをこのように使用します:

matrix<int> k(5);
k.Set(5,5,6);
cout<<k.Get(5,5);

問題は、Setを呼び出すときにヒープ破損エラーが発生することです。私は何が間違っているのですか?(私の推測では、それは私がそれらの配列要素にアクセスする方法です)

4

4 に答える 4

2

5 要素の配列は、インデックス 0 ~ 4 でアクセスできます。xとに5 を渡しているためy、 にアクセスすると無効なインデックスになりますarray

于 2012-04-07T16:53:47.003 に答える
0

C++ の配列は 0 ベースです。つまり、配列がある場合int x[5]x[5]無効です。

あなたの条件はif( ( x<0 || x>=_n ) && ( y<0 || y>=_n) )if( ( x<0 || x>=_n ) && ( y<0 || y>=_n) )

最後の要素を設定するには、必要です

k.Set(4,4,6);

そしてそれを印刷するには:

cout<<k.Get(4,4);
于 2012-04-07T16:54:49.543 に答える
0

摩耗しているのは、0 からカウントを開始する必要があることです。サイズ n*n の配列を作成すると、(n-1)*(n-1) までの要素にアクセスできます。この例では、サイズ 5*5=25 の配列を作成し、要素 25 にアクセスしようとします。ただし、24 は、配列に含まれる最高要素です。

于 2012-04-07T16:55:17.847 に答える
0

配列を超えてメモリにインデックスを付けているため、エラーが発生しています。

問題はインデックス作成にあります。C++ での配列のインデックスは 0 から始まるため、k(5) の宣言では、0 ~ 4 のインデックスが付けられた 5 の配列が生成されるため、5 のインデックスは有効な有効なインデックスではありません。インデックス 5 は無効であるため、チェックイン セットを x>=_n および y>=_n に変更する必要があります。

于 2012-04-07T16:56:58.743 に答える