動的に定義された配列を作成する方法について混乱しています。
int *array = new int[n];
これが何をしているのかわかりません。新しいオブジェクト/配列intを指しているarrayという名前のポインタを作成しているとわかりますか?誰か説明したいですか?
newは、要求したオブジェクト/配列を保存するために必要なメモリ量を割り当てます。この場合、n個の整数。
ポインタは、このメモリブロックへのアドレスを保存します。
ただし、この割り当てられたメモリブロックは、次のように記述するまで解放されないことに注意してください。
delete [] array;
_int *array = new int[n];
_
タイプint
およびサイズn
の動的配列へのポインターを宣言します。
もう少し詳細な答え:new
はsizeof(int) * n
バイトに等しいサイズのメモリを割り当て、変数array
によって保存されているメモリを返します。また、メモリはnew
を使用して動的に割り当てられるため、書き込みによって手動で割り当てを解除する必要があります(もちろん不要になった場合)。
_delete []array;
_
そうしないと、プログラムは少なくともsizeof(int) * n
バイトのメモリをリークします(実装で使用される割り当て方法に応じて、それ以上になる可能性があります)。
ステートメントは基本的に次のことを行います。
サイズNの整数配列に等しいヒープ上のスペースを割り当て、それへのポインターを返します。これは、「配列」と呼ばれるint *タイプのポインターに割り当てられます。
Nの値に従ってその量のスペースを割り当て、ポインターは配列、つまり配列の最初の要素を指します
int *array = new int[n];
C/C++では、ポインターと配列は(ほぼ)同等です。 _int *a; a[0];
_は_*a
_を返し、_a[1];
_は*(a + 1)
を返します
ただし、配列はポインターが変更できるのに対して、ポインターは変更できません。
_new int[n]
_は、「配列」にいくつかのスペースを割り当てます
C++ 11の時点で、これを行うメモリセーフな方法(同様の構成を使用)は std::unique_ptr
:
std::unique_ptr<int[]> array(new int[n]);
これにより、n
整数に十分な大きさのメモリブロックへのスマートポインターが作成され、スコープ外になると自動的に削除されます。この自動クリーンアップは重要です。コードが早期に終了してdelete [] array;
ステートメント。
別の(おそらく望ましい)オプションは std::vector
動的なサイズ変更が可能な配列が必要な場合。これは、未知の量のスペースが必要な場合に適していますが、いくつかの欠点(要素を追加/削除する時間が一定ではない)があります。次のような方法で配列を作成し、それに要素を追加できます。
std::vector<int> array;
array.Push_back(1); // adds 1 to end of array
array.Push_back(2); // adds 2 to end of array
// array now contains elements [1, 2]