0

オブジェクトの配列を再割り当てしようとしていますが、セグメンテーション違反が発生しています。

これはコードです:

Array.h

class Array
{

private:

    int * _Array;
    int length;
    int id;

    Array(int size, bool insert);
    static Array** allsArrays;
    static size_t sizeAll;
    static int amountOfArrays;

public:
    Array();
    Array(int size);
    Array(const Array& source); 

};

配列.cpp

int Array::amountOfArrays=0;
size_t Array::sizeAll=10;
Array** Array::allsArrays= new Array*[sizeAll];
Array Array::intitialsArray(0, false);

//constructor
Array::Array(int size, bool insert)
{
    if(size != 0)
    {
       sArray = new int [size];

        for(int i=0; i<size; i++)
        {
            sArray[i]=0;
        }
    }
    else
        sArray = NULL;

    length = size;
    id=0;
    if(insert == true)
    {
        insertToAllsArr(*this);
        amountOfArrays++;
        id = amountOfArrays;
    }

}


//the part that crashes, part of insertToAllsArr function

    //realloc
    if(sizeAll < amountOfArrays)
    {
        int oldSize=sizeAll;
        sizeAll += 10;
        Array **tmp=new Array*[sizeAll];
        for( i=0;i<(int)sizeAll;i++)
        {
           *tmp = &intitialsArray;
            if(i < oldSize)
            {
                 *tmp = *allsArrays;
                 ++allsArrays;
            }

            ++tmp;
        }

        for(i=0; i< (int)sizeAll ; i++ ,--tmp);
        for(i=0 ; i< oldSize ; i++, --allsArrays);

        allsArrays= new Array*[sizeAll];

        for( i=0;i<(int)sizeAll;i++)
        {
            *allsArrays = *tmp;
            ++allsArrays;
            ++tmp;
        }

    }

別の関数から allArrays にアクセスしようとすると、セグメンテーション違反が発生します。私は何を間違っていますか?(なぜ std を使用しないのかと尋ねる人のために、コピー コンストラクターが原因で使用できません) ありがとうございます。

4

1 に答える 1

1

増加allsArraysしていて、元の値にリセットしていないようです。最初のループではそれを行いますが、2 番目のループでは行いません (らしい)。

これは非常に醜いコードです。私はそれをきれいにしようと思います。ある配列から別の配列に値をコピーするために 2 つのループは必要ありません。tmp 配列も必要ありません。そのようなポインターのインクリメントをいじる必要もありません。また、少なくとも 2 つのメモリ リークがあるようです。

于 2013-09-22T15:58:58.400 に答える