newとmalloc()の違い
コンテンツ
newとmalloc()は両方とも、メモリを動的に割り当てるために使用されます。ただし、newとmalloc()は多くの短所で異なります。 newとmalloc()の主な違いは、 新しい 構成要素として使用される演算子です。一方、 malloc() は、実行時にメモリを割り当てるために使用される標準ライブラリ関数です。それらの間の他の違いは、比較チャートで以下で説明します。
- 比較表
- 定義
- 主な違い
- 結論
比較表
比較の根拠 | 新しい | malloc() |
---|---|---|
言語 | 演算子newは、C ++、Java、およびC#の特定の機能です。 | 関数malloc()はCの機能です。 |
自然 | 「new」は演算子です。 | malloc()は関数です。 |
のサイズ( ) | newは特定のタイプに十分なメモリを割り当てるため、sizeof演算子を必要としません。 | mallocでは、割り当てるメモリサイズを知るために、sizeof演算子が必要です。 |
コンストラクタ | 演算子newは、オブジェクトのコンストラクターを呼び出すことができます。 | malloc()は、コンストラクターをまったく呼び出せません。 |
初期化 | 演算子newは、メモリを割り当てるときにオブジェクトを初期化できます。 | メモリの初期化をmallocで実行できませんでした。 |
過負荷 | 演算子newはオーバーロードできます。 | malloc()をオーバーロードすることはできません。 |
失敗 | 失敗すると、演算子newは例外をスローします。 | 失敗すると、malloc()はNULLを返します。 |
割り当て解除 | 「delete」を使用して割り当て解除された新しいメモリ割り当て。 | malloc()によるメモリ割り当ては、free()関数を使用して割り当て解除されます。 |
再配分 | new演算子はメモリを再割り当てしません。 | malloc()によって割り当てられたメモリは、realloc()を使用して再割り当てできます。 |
実行 | 演算子newは実行時間を短縮します。 | malloc()の実行にはさらに時間が必要です。 |
新規の定義
オペレーター 新しい メモリを動的に割り当てるメモリ割り当て演算子です。 new演算子は、ヒープにメモリを割り当て、参照変数に割り当てられているメモリの開始アドレスを返します。 new演算子はCのmalloc()に似ています。ただし、C ++コンパイラはmalloc()と互換性がありますが、malloc()よりも特定の利点があるため、new演算子を使用することをお勧めします。 new演算子の構文は次のとおりです。
type variable_name = new type(parameter_list);
ここで、「タイプ」は、メモリを割り当てる必要がある変数のデータタイプを示します。 「variable_name」という単語は、メモリへのポインタを保持する参照変数に付けられた名前です。ここの括弧は、コンストラクターの呼び出しを指定します。 parameter_listは、新しく構築されたオブジェクトを初期化するためにコンストラクターに渡される値のリストです。
new演算子は、特定のタイプのオブジェクトに必要な十分なメモリを割り当てます。したがって、sizeof()演算子は不要です。また、realloc()を使用してメモリを再割り当てするmalloc()のように、メモリのサイズを変更する必要もありません。新しい演算子は構造です。通常、オブジェクトの初期化に使用される宣言中に、オブジェクトのコンストラクターを呼び出します。
new演算子がヒープ内のメモリを割り当て、ヒープのサイズが制限されることを知っています。そのため、ヒープがメモリ不足で、新しいオペレータがメモリを割り当てようとすると、新しいオペレータが失敗します。 new演算子がメモリの割り当てに失敗すると、例外をスローします。コードがその例外を処理できない場合、プログラムは異常終了します。
演算子newによって割り当てられたメモリは、delete演算子を使用して解放できます。 new演算子は、関数ではなく演算子であるため、実行時間をカットします。
malloc()の定義
の malloc() 要求された量のメモリをヒープに割り当てるために使用される関数です。このメソッドは、「void」型のポインターを返します。これはさらに、指定された型のメモリーへのポインターを取得するために型キャストされ、このメモリーへのポインターは参照変数に割り当てられます。 malloc()関数は、メモリを動的に割り当てるために使用されるため、C ++のnew演算子に似ています。 malloc()は標準ライブラリ関数です。 malloc()関数の構文は次のとおりです。
type variable_name =(type *)malloc(sizeof(type));
ここで、「タイプ」は、メモリを割り当てる必要がある変数のデータタイプを示します。 variable_nameは、malloc()によって返されるポインターが割り当てられる参照変数の名前です。 (type *)は、特定の型のメモリへのポインターを取得するための型キャストを記述します。 sizeof()は、malloc()、つまり必要なメモリサイズを記述します。
malloc()によって返されるポインターはvoid型であるため、malloc()は型キャストを必要とします。したがって、ポインターに型を割り当てるには、型キャストが必要です。 sizeof()は、関数malloc()が生メモリを割り当てるために必要です。したがって、malloc()関数に割り当てるメモリサイズを通知する必要があります。割り当てられたメモリが十分でない場合、realloc()を使用してサイズを変更したり、再割り当てしたりできます。
malloc()関数は、ヒープにメモリを割り当てます。ヒープがメモリ不足の場合、malloc()関数はNULLポインターを返します。したがって、malloc()によって返されるポインターを含む参照変数は、使用する前に確認する必要があります。そうしないと、システムがクラッシュする可能性があります。
malloc()関数によって割り当てられたメモリは、free()を使用して割り当て解除されます。関数呼び出しはオーバーヘッドにつながるため、malloc()は実行にさらに時間がかかります。
- new演算子は、C ++で導入され、Java、C#などで使用される構造です。一方、malloc()は、C言語でのみ使用され、C ++でサポートされる標準ライブラリ関数です。
- newオペレーターは、指定されたタイプのオブジェクトに十分なメモリーを割り当てるため、サイズ変更オペレーターは不要です。一方、malloc()関数では、sizeof()演算子を使用して、割り当てるメモリサイズを関数に知らせる必要があります。
- new演算子は、宣言中にオブジェクトのコンストラクターを呼び出すことができます。一方、malloc()関数はコンストラクターを呼び出すことはできません。
- 演算子「new」はオーバーロードできますが、malloc()はできませんでした。
- new演算子がメモリの割り当てに失敗すると、例外をスローします。例外はコードで処理する必要があります。例外がなければ、プログラムは終了します。一方、malloc()関数は、メモリの割り当てに失敗するとNULLポインターを返します。これをチェックせずにポインターを使用すると、システムがクラッシュします。
- 新しい演算子を使用して割り当てられたメモリは、「削除」を使用して割り当てを解除できます。一方、malloc()関数を使用して割り当てられたメモリは、free()を使用して割り当て解除できます。
- 新しい演算子を使用してメモリが割り当てられると、とにかくサイズを変更できません。一方、malloc()関数を使用して割り当てられたメモリは、realloc()関数を使用して再割り当て(サイズ変更)できます。
- mallocは関数であり、newは構造であるため、newの実行時間はmalloc()と比較して短くなります。
結論:
malloc()関数は、メモリを動的に割り当てる古い方法です。現在、new演算子はmalloc()よりも特定の利点があるため、実行時にメモリを割り当てるために使用されます。