web-dev-qa-db-ja.com

int * array = new int [n];この関数は実際に何をしていますか?

動的に定義された配列を作成する方法について混乱しています。

 int *array = new int[n];

これが何をしているのかわかりません。新しいオブジェクト/配列intを指しているarrayという名前のポインタを作成しているとわかりますか?誰か説明したいですか?

17
pauliwago

newは、要求したオブジェクト/配列を保存するために必要なメモリ量を割り当てます。この場合、n個の整数。

ポインタは、このメモリブロックへのアドレスを保存します。

ただし、この割り当てられたメモリブロックは、次のように記述するまで解放されないことに注意してください。

delete [] array;
19
ANisus
_int *array = new int[n];
_

タイプintおよびサイズnの動的配列へのポインターを宣言します。

もう少し詳細な答え:newsizeof(int) * nバイトに等しいサイズのメモリを割り当て、変数arrayによって保存されているメモリを返します。また、メモリはnewを使用して動的に割り当てられるため、書き込みによって手動で割り当てを解除する必要があります(もちろん不要になった場合)。

_delete []array;
_

そうしないと、プログラムは少なくともsizeof(int) * nバイトのメモリをリークします(実装で使用される割り当て方法に応じて、それ以上になる可能性があります)。

9
Nawaz

ステートメントは基本的に次のことを行います。

  1. 「n」要素の整数配列を作成します
  2. new演算子を使用してポインターを作成しているときに、プロセスのHEAPメモリにメモリを割り当てます
  3. 有効なアドレスを返します(このステートメントの実行時点で必要なサイズのメモリ割り当てが利用可能な場合)
8
aeon

サイズNの整数配列に等しいヒープ上のスペースを割り当て、それへのポインターを返します。これは、「配列」と呼ばれるint *タイプのポインターに割り当てられます。

1
DhruvPathak

Nの値に従ってその量のスペースを割り当て、ポインターは配列、つまり配列の最初の要素を指します

int *array = new int[n];
1
sgokhales

C/C++では、ポインターと配列は(ほぼ)同等です。 _int *a; a[0];_は_*a_を返し、_a[1];_は*(a + 1)を返します

ただし、配列はポインターが変更できるのに対して、ポインターは変更できません。

_new int[n]_は、「配列」にいくつかのスペースを割り当てます

0
LLS

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]
0
Engineero