1. ホーム
  2. c++

[解決済み] 動的割り当て配列から別の配列へのコピー C++

2022-02-25 16:20:19

質問

これは超簡単に解決できそうなのですが、どうしてもわかりません。 私は単純にサイズ変更した配列を作成し、元の値をすべてコピーして、最後に古い配列を削除してメモリを解放しようとしています。

void ResizeArray(int *orig, int size) {
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++)
        resized[i] = orig[i];
    delete [] orig;
    orig = resized;
}

ここで起こっていると思われるのは resized[i] = orig[i] をコメントアウトしない限り,orig をリサイズした後に印刷すると大量のジャンク値が返されるため,値ではなく参照によって値をコピーしています. delete [] orig . どうすればorigからresizedに深くコピーできるのでしょうか、それとも何か他の問題があるのでしょうか。私はstd::vectorを使いたくありません。

どのように解決するのですか?

C++のパラメータは、値で渡されることを忘れないでください。あなたが代入しているのは resized コピー のポインタを渡すと、関数の外側のポインタは同じままです。

ダブルインダイレクト(または "ダブルポインタ"、つまり、ポインタを int ):

void ResizeArray(int **orig, int size) {
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++)
        resized[i] = (*orig)[i];
    delete [] *orig;
    *orig = resized;
}

またはそのポインタへの参照。

void ResizeArray(int *&orig, int size) {
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++)
        resized[i] = orig[i];
    delete [] orig;
    orig = resized;
}

ちなみに、配列のサイズには std::size_t から <cstddef> - は、あらゆるオブジェクトのサイズを保持することが保証されており、オブジェクトのサイズを扱っていることが明確になります。