2017-01-30 8 views
-4

前の配列がいっぱいであれば、新しい動的配列を再割り当てする関数を作成しています。しかし、私がそれをコンパイルすると、実行時エラーが発生します。 Visual Studio 2015でデバッグすると、関数の実行後にコンパイラがダイナミック配列にアクセスできないか、配列が削除されたように見えます。なぜか教えてくれますか?関数内の動的配列を宣言する

void reallocateMemory(string* arr, int& physicalSize, int addedMemory) { 
    string* result = new string[physicalSize + addedMemory]; 
    for (int i = 0; i < physicalSize; i++) { 
     result[i] = arr[i]; 
    } 

    delete[] arr; 

    arr = result; // After this code, it seems variable arr works well. 
    result = nullptr; 
    physicalSize += addedMemory; 
} // However, when the function returns, arr cannot access a dynamic array. 
+3

'arr = result'はローカル変数' arr'にのみ割り当てます。呼び出し元は更新されたポインタを取得しません。 – user2357112

+4

'std :: vector'などを使わないのはなぜですか? – user2357112

+1

@ user2357112のコメントには、 'string *&'( 'string'へのポインタへの参照)が必要です。しかし、実際には 'std :: vector'を使用してください。 –

答えて

0

しかし、関数戻り、ARRがダイナミックアレイにアクセスできないとき。

実際。 arrはローカル変数であり、関数が返っても存在しなくなります。関数内で割り当てたメモリは、変数によって指されなくなったため、リークします。

関数のスコープ外に新しく割り当てられたメモリにポインタを渡す方法が必要です。それを行う典型的な方法は次のとおりです。1)関数の戻り値の型を変更し、ポインタを返す。2)関数が参照されたポインタ変数を変更できるように、元のポインタ値を参照として渡す。

関連する問題