1

動的に割り当てられた配列を作成しようとしています。これは、いっぱいになると、すべてを保持するのに十分な大きさの新しい配列を作成し、すべての値を古い配列から新しい配列にコピーします。これは、呼び出されると、tmp が指す新しい配列を動的に割り当て、arr[i] から tmp [i] に値を移動します。しかし、使い終わったら tmp を削除する必要があるのでしょうか? tmp を削除せずに配列の内容を印刷しようとすると問題なく印刷されますが、tmp を削除すると、物事が奇妙になり始め、内容が本来の方法で印刷されなくなるためです。これが私のコードです:

ArrayList::ArrayList(int initsize): last(0), size(initsize), origsize(initsize)
{
    arr = new int[size];
}

ArrayList::ArrayList() 
{
    last = 0;
    size = 16;
    origsize = 16;
    arr = new int[size];
}

void ArrayList::append(int value) 
{
    if (last<size) {
        arr[last] = value;
    }

    last++;

    if (last == size) {

        int* tmp = new int[size+origsize];
        int i = 0;

        for (i=0; i<(size+origsize); i++)
            tmp[i] = arr[i];

        size = size+origsize;
        arr = tmp;
        arr[last] = value;

        //delete tmp;
    }
}
4

5 に答える 5

2

問題はここにあります:

for (i=0; i<(size+origsize); i++) {

        tmp[i] = arr[i];

    }

arr の長さは 'size' ですが、それを超える要素にアクセスしようとしています。未定義の動作が発生します。

IMO、プログラムで配列のサイズを変更しようとしないでください。動的なサイズのコンテナが必要な場合は、代わりに std::vector を使用してください。

編集:他の人が指摘したように、これが学術的な理由である場合は、次のようにコードを変更できます。

void ArrayList::append(int value) 
{
    if (last<size) {
        arr[last] = value;
        last++;
    } else { // last shall be equal to size.

        int* tmp = new int[size+origsize];
        int i = 0;

        for (i=0; i<(size); i++) // delete + originalsize
            tmp[i] = arr[i];

        size = size+origsize;
        int* newTemp = arr; // make a new pointer point to where arr was pointing
        arr = tmp;         // make arr point to where tmp was pointing.
        //tmp = newTemp; // You do not need this statement.
        arr[last] = value;
        last++;
        delete [] newTemp; // delete the old array memory block
    }
}
于 2013-10-25T07:46:01.163 に答える
2

あなたのarrは現在tmpです。どちらも新しい配列を指しているということです。そして、古いものを削除する必要があります。行う

int* old = arr;
arr = tmp;
delete [] old;
arr[last] = value;
于 2013-10-25T07:46:26.847 に答える
0

新しい配列は古い配列を指します。

したがって、コードでは(変更なしで)arrを削除できません

于 2013-10-25T07:48:42.107 に答える
0

tmp を *. スコープを離れる (次の } を残す) と、自動的に割り当てが解除されず、メモリ リークが発生します。ポインターと、ポインターを宣言してヒープに配置し、手動で削除する必要があることについて、ここに役立つ投稿があります。ここで動的配列を作成しようとしているので。tmp ではなく、arr をポインターにしたいと思います。このC ++チュートリアルをチェックしてください

于 2013-10-25T08:01:13.087 に答える