それらは機能的に同等であり、delete を呼び出すときに [] 演算子を使用する必要がある唯一の違いですか、それとも他に何か不足していますか?
ありがとう
それらは機能的に同等であり、delete を呼び出すときに [] 演算子を使用する必要がある唯一の違いですか、それとも他に何か不足していますか?
ありがとう
Mehrdadがこの質問で言っているように:
malloc は初期化されていないメモリを割り当てます。割り当てられたメモリは free で解放する必要があります。
new は、コンストラクター (オブジェクトの場合) を呼び出して、割り当てられたメモリを初期化します。new で割り当てられたメモリは、delete で解放する必要があります (デストラクタを呼び出します)。必要なサイズを手動で指定して、適切な型にキャストする必要はありません。したがって、より現代的でエラーが発生しにくくなっています。
注:- new は演算子、malloc は関数です。
いくつかの違いがあります。
まず、new int[5]
を使用して解放する必要がありdelete[]
、を使用して解放するmalloc(...)
必要がありますfree
。混ぜ合わせることはできません。
次に、コンストラクターで型を使用すると、コンストラクターmalloc
が呼び出されfree
ず、デストラクターも呼び出されません。それらを手動で呼び出す必要があります (または単にnew
/を使用しますfree
)。
new 演算子は、失敗した場合に new_handler を呼び出し、場合によっては std::bad_alloc 例外を発生させます。malloc() は何もしません。
演算子 new および new[]。
動的メモリを要求するために、演算子 new が存在します。new の後にデータ型が続き、必要に応じて括弧 [] 内に必要な要素の数が続きます。割り当てられたメモリの新しいブロックの先頭へのポインタを返します。
その形式は次のとおりです。pointer = new type orpointer = new type [elements] 最初の式は、型の 1 つの要素を格納するメモリを割り当てるために使用されます。2 つ目は、型の要素のブロック (配列) を割り当てるために使用されます。例えば:
int * ボビー;
ボビー = 新しい int [5];
この場合、オペレーティング システムはヒープ内に int 型の 5 つの要素用のスペースを割り当て、bobby に割り当てられた先頭へのポインターを返しました。したがって、現在、bobby は 5 つの int 要素用のスペースを持つ有効なメモリ ブロックを指しています。
関数 malloc。
ポインタに動的メモリを割り当てる汎用関数です。そのプロトタイプは次のとおりです。void * malloc (size_t nbytes); ここで、nbytes は、ポインターに割り当てたいバイト数です。関数は void* 型のポインターを返します。これは、値を宛先ポインターの型に型キャストする必要がある理由です。次に例を示します。
チャー*ロニー;
ロニー = (char *) malloc (10);
これにより、使用可能な 10 バイトのブロックへのポインターが ronny に割り当てられます。char 以外の異なるタイプ (1 バイトとは異なる) のデータのブロックを割り当てたい場合は、必要な要素の数に各要素のサイズを掛ける必要があります。幸いなことに、具体的なデータのデータ型のサイズを返す演算子 sizeof を自由に使用できます。
int * ボビー;
bobby = (int *) malloc (5 * sizeof(int));
このコードは bobby に int 型の 5 つの整数のブロックへのポインターを割り当てます。このサイズは、プログラムがコンパイルされるシステムに応じて、2、4、またはそれ以上のバイトに等しくなる可能性があります。
new
タイプセーフがありますが、malloc
ありません。
new
コンストラクターを呼び出しますが、呼び出しmalloc
ません。
delete
デストラクタを呼び出しますが、呼び出しfree()
ません。