0

STL ライブラリ (ベクトルなど) を使用せずにサイズを変更したい、動的に割り当てられたポリモーフィック オブジェクトの配列があります。次のように、オリジナルを一時配列に移動してから、オリジナルを削除してから、オリジナルを一時配列に等しく設定しようとしました。

int x = 100;
int y = 150;

Animal **orig = new Animal*[x];
Animal **temp = new Animal*[y];

//allocate orig array
for(int n = 0; n < x; n++)
{
    orig[n] = new Cat();
}

//save to temp
for(int n = 0; n < x; n++)
{
    temp[n] = orig[n];
}

//delete orig array
for(int n = 0; n < x; n++)
{
    delete orig[n];
}
delete[] orig;

//store temp into orig
orig = temp;

ただし、たとえば要素にアクセスしようとすると:

cout << orig[0]->getName();

メモリ割り当てエラーが発生します。

Unhandled exception at at 0x768F4B32 in file.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0033E598.
4

2 に答える 2

4
//delete orig array
for(int n = 0; n < x; n++)
{
    delete orig[n];
}

この特定のケースでは、これを行わないでください。実際には、配列ではなくオブジェクトを削除しています。そのため、一時配列内のすべてのオブジェクトが無効な場所を指しています。delete [] orig元の配列の割り当てを解除するだけです。

于 2012-11-21T18:49:50.697 に答える
1

あなたは間違ってコピーしています。一時配列をコピーする代わりに、元の場所と同じ場所を指すだけです。Orig を削除すると、一時ポインタが無効な場所を指します。

//save to temp
for(int n = 0; n < x; n++)
{
    //temp[n] = orig[n];
    // Try this instead
    strcpy(temp[n], orig[n]);
}
于 2012-11-21T18:55:40.893 に答える