私はC++が初めてです。配列の初期化とメモリの割り当て解除を区別するのに苦労しています。私には、それらは同じ目的を達成しているように見えます。
具体的には、 を介して配列を初期化できますint myArray[] = {1, 2, 3};
。malloc
また、メモリを取得して void ポインタに割り当てるために使用することもできます。後で、このメモリを解放します。
これら2つの方法の違いは何ですか? コンピュータはデータを同じ場所に同じ方法で保存しますか?
私はC++が初めてです。配列の初期化とメモリの割り当て解除を区別するのに苦労しています。私には、それらは同じ目的を達成しているように見えます。
具体的には、 を介して配列を初期化できますint myArray[] = {1, 2, 3};
。malloc
また、メモリを取得して void ポインタに割り当てるために使用することもできます。後で、このメモリを解放します。
これら2つの方法の違いは何ですか? コンピュータはデータを同じ場所に同じ方法で保存しますか?
C++ では、メモリを割り当てる方法が 2 つあります。最初の方法では、スタックにメモリを割り当てます。
int arr[] = {1,2,3};
int arr[3];
これらのコード行は両方とも、スタック上にサイズ 3 の配列を作成します。唯一の違いは、最初の行でも配列内の値を初期化することです。
メモリを割り当てることができる 2 番目の方法は、ヒープ上です。通常、ヒープで使用できるメモリの量は、スタックで使用できるよりもはるかに大きくなります。new
および操作はmalloc
、ヒープにメモリを割り当てます。
int* arr = (int*) malloc(100*sizeof(int));
int* arr = new int[100];
これらのコード行は両方とも、ヒープ上にサイズ 100 の配列を作成します。さて、ここに両者の違いがあります。C++ ではnew
、配列内の各要素のコンストラクターが呼び出されることが保証されるため、常に使用する必要があります。また、どのようにでも解釈できるバイトのチャンクに をmalloc
返すだけなので、タイプ セーフではないものとは異なり、はるかにタイプ セーフです。void*
メモリを動的に割り当てる場合、つまり実行時まで配列のサイズがわからない場合は、常にnew
/を使用してヒープに割り当てる必要がありますmalloc
。
最後に注意すべきことは、delete
/を使用してメモリを解放する方法ですfree
。
free(arr); //arr was allocated with malloc
delete[] arr; //arr was allocated with new
でメモリを割り当てた場合は、new
で解放する必要がありますdelete
。new
/malloc
とdelete
/を組み合わせて使用することはできませんfree
。最後にdelete[]
、オブジェクトの配列を解放します。単一のオブジェクトのみを割り当てた場合は、delete
.
Object* myobj = new Object;
delete myobj;
私の意見では、この質問はここに属していません。しかし、私はそれに答えます。あなたはそれを行うことができます:
int* myArray = (int *) malloc(3 * sizeof(int));
これは、メモリ サイズ 3 * sizeof(int) [つまり、C の整数データ型のサイズ] でメモリ ロケーションを作成し、このメモリ ロケーションへの int ポインタを返すことを意味します。[つまり、その先頭を指すポインターであり、整数が含まれているかのように処理します]。これらのメモリ スロットは int * に ((int *) を使用して) 変換され、myArray と呼ばれます。myArray は int 配列 (および int ポインター) です。配列は実際にはCのポインターであるため、次のようにします。
for (int i = 0; i < 3; i++)
myArray[i] = i + 1;
malloc に問題がある可能性があります。したがって、初期化後は常に myArray == NULL かどうかを確認してください。この場合、エラーを修正し、配列を $\{1,2,3\}$ で初期化しないでください。そうしないと、セグメンテーション違反が発生します。
私はあなたに漠然としていないことを願っています。ただし、C++ を使用しているため、代わりに new 演算子を使用することをお勧めします。あなたがするだろう:
int myArray[] = new int[3];