logo

C++ の malloc() と new の比較

どちらも malloc() C++ の new と new は同じ目的で使用されます。これらは、実行時にメモリを割り当てるために使用されます。ただし、malloc() と new の構文は異なります。 malloc() と new の主な違いは、new が演算子であるのに対し、malloc() は事前定義された標準ライブラリ関数であることです。 標準ライブラリ ヘッダファイル。

Javaをアップグレードする方法

なにが新しい?

新しいのはメモリ割り当て演算子で、実行時にメモリを割り当てるために使用されます。 new オペレーターによって初期化されたメモリーはヒープに割り当てられます。変数に割り当てられるメモリの開始アドレスを返します。 C++ の new 演算子の機能は、 C プログラミング言語C++ は malloc() 関数とも互換性がありますが、利点があるため、主に new 演算子が使用されます。

新しい演算子の構文

 type variable = new type(parameter_list); 

上記の構文では

タイプ: new 演算子によってメモリが割り当てられる変数のデータ型を定義します。

変数: メモリを指す変数の名前です。

パラメータリスト: これは、変数に初期化される値のリストです。

new 演算子は、メモリの割り当てに sizeof() 演算子を使用しません。また、new オペレーターはオブジェクトに十分なメモリを割り当てるため、サイズ変更も使用しません。宣言時にコンストラクタを呼び出してオブジェクトを初期化する構造です。

ご存知のとおり、new オペレーターはヒープ内にメモリーを割り当てます。ヒープ内でメモリが使用できない場合に、new オペレータがメモリを割り当てようとすると、例外がスローされます。コードが例外を処理できない場合、プログラムは異常終了します。

例を通して新しい演算子を理解しましょう。

kmpアルゴリズム
 #include using namespace std; int main() { int *ptr; // integer pointer variable declaration ptr=new int; // allocating memory to the pointer variable ptr. std::cout &lt;&lt; &apos;Enter the number : &apos; &lt;&gt;*ptr; std::cout &lt;&lt; &apos;Entered number is &apos; &lt;<*ptr<< std::endl; return 0; } < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c.webp" alt="malloc() vs new in C++"> <h3>What is malloc()?</h3> <p>A malloc() is a function that allocates memory at the runtime. This function returns the void pointer, which means that it can be assigned to any pointer type. This void pointer can be further typecast to get the pointer that points to the memory of a specified type.</p> <p>The syntax of the malloc() function is given below:</p> <pre> type variable_name = (type *)malloc(sizeof(type)); </pre> <p> <strong>where,</strong> </p> <p> <strong>type:</strong> it is the datatype of the variable for which the memory has to be allocated.</p> <p> <strong>variable_name:</strong> It defines the name of the variable that points to the memory.</p> <p> <strong>(type*):</strong> It is used for typecasting so that we can get the pointer of a specified type that points to the memory.</p> <p> <strong>sizeof():</strong> The sizeof() operator is used in the malloc() function to obtain the memory size required for the allocation.</p> <h4>Note: The malloc() function returns the void pointer, so typecasting is required to assign a different type to the pointer. The sizeof() operator is required in the malloc() function as the malloc() function returns the raw memory, so the sizeof() operator will tell the malloc() function how much memory is required for the allocation.</h4> <p>If the sufficient memory is not available, then the memory can be resized using realloc() function. As we know that all the dynamic memory requirements are fulfilled using heap memory, so malloc() function also allocates the memory in a heap and returns the pointer to it. The heap memory is very limited, so when our code starts execution, it marks the memory in use, and when our code completes its task, then it frees the memory by using the free() function. If the sufficient memory is not available, and our code tries to access the memory, then the malloc() function returns the NULL pointer. The memory which is allocated by the malloc() function can be deallocated by using the free() function.</p> <p> <strong>Let&apos;s understand through an example.</strong> </p> <pre> #include #include using namespace std; int main() { int len; // variable declaration std::cout &lt;&lt; &apos;Enter the count of numbers :&apos; &lt;&gt; len; int *ptr; // pointer variable declaration ptr=(int*) malloc(sizeof(int)*len); // allocating memory to the poiner variable for(int i=0;i<len;i++) { std::cout << 'enter a number : ' <> *(ptr+i); } std::cout &lt;&lt; &apos;Entered elements are : &apos; &lt;&lt; std::endl; for(int i=0;i<len;i++) { std::cout << *(ptr+i) std::endl; } free(ptr); return 0; < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-2.webp" alt="malloc() vs new in C++"> <p>If we do not use the <strong>free()</strong> function at the correct place, then it can lead to the cause of the dangling pointer. <strong>Let&apos;s understand this scenario through an example.</strong> </p> <pre> #include #include using namespace std; int *func() { int *p; p=(int*) malloc(sizeof(int)); free(p); return p; } int main() { int *ptr; ptr=func(); free(ptr); return 0; } </pre> <p>In the above code, we are calling the func() function. The func() function returns the integer pointer. Inside the func() function, we have declared a *p pointer, and the memory is allocated to this pointer variable using malloc() function. In this case, we are returning the pointer whose memory is already released. The ptr is a dangling pointer as it is pointing to the released memory location. Or we can say ptr is referring to that memory which is not pointed by the pointer.</p> <p>Till now, we get to know about the new operator and the malloc() function. Now, we will see the differences between the new operator and the malloc() function.</p> <h3>Differences between the malloc() and new</h3> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-3.webp" alt="malloc() vs new in C++"> <ul> <li>The new operator constructs an object, i.e., it calls the constructor to initialize an object while <strong>malloc()</strong> function does not call the constructor. The new operator invokes the constructor, and the delete operator invokes the destructor to destroy the object. This is the biggest difference between the malloc() and new.</li> <li>The new is an operator, while malloc() is a predefined function in the stdlib header file.</li> <li>The operator new can be overloaded while the malloc() function cannot be overloaded.</li> <li>If the sufficient memory is not available in a heap, then the new operator will throw an exception while the malloc() function returns a NULL pointer.</li> <li>In the new operator, we need to specify the number of objects to be allocated while in malloc() function, we need to specify the number of bytes to be allocated.</li> <li>In the case of a new operator, we have to use the delete operator to deallocate the memory. But in the case of malloc() function, we have to use the free() function to deallocate the memory.</li> </ul> <p> <strong>Syntax of new operator</strong> </p> <pre> type reference_variable = new type name; </pre> <p> <strong>where,</strong> </p> <p> <strong>type:</strong> It defines the data type of the reference variable.</p> <p> <strong>reference_variable:</strong> It is the name of the pointer variable.</p> <p> <strong>new:</strong> It is an operator used for allocating the memory.</p> <p> <strong>type name:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = new int; </pre> <p>In the above statements, we are declaring an integer pointer variable. The statement <strong>p = new int;</strong> allocates the memory space for an integer variable.</p> <p> <strong>Syntax of malloc() is given below:</strong> </p> <pre> int *ptr = (data_type*) malloc(sizeof(data_type)); </pre> <p> <strong>ptr:</strong> It is a pointer variable.</p> <p> <strong>data_type:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = (int *) malloc(sizeof(int)) </pre> <p>The above statement will allocate the memory for an integer variable in a heap, and then stores the address of the reserved memory in &apos;p&apos; variable.</p> <ul> <li>On the other hand, the memory allocated using malloc() function can be deallocated using the free() function.</li> <li>Once the memory is allocated using the new operator, then it cannot be resized. On the other hand, the memory is allocated using malloc() function; then, it can be reallocated using realloc() function.</li> <li>The execution time of new is less than the malloc() function as new is a construct, and malloc is a function.</li> <li>The new operator does not return the separate pointer variable; it returns the address of the newly created object. On the other hand, the malloc() function returns the void pointer which can be further typecast in a specified type.</li> </ul> <hr></len;i++)></len;i++)></pre></*ptr<<>

どこ、

タイプ: これは、メモリを割り当てる必要がある変数のデータ型です。

変数名: メモリを指す変数の名前を定義します。

(タイプ*): これは型キャストに使用され、メモリを指す指定された型のポインタを取得できます。

のサイズ(): sizeof() 演算子は、割り当てに必要なメモリ サイズを取得するために malloc() 関数で使用されます。

注: malloc() 関数は void ポインターを返すため、ポインターに別の型を割り当てるには型キャストが必要です。 malloc() 関数は生のメモリを返すため、malloc() 関数には sizeof() 演算子が必要です。そのため、sizeof() 演算子は、割り当てに必要なメモリ量を malloc() 関数に伝えます。

十分なメモリが利用できない場合は、realloc() 関数を使用してメモリのサイズを変更できます。ご存知のとおり、すべての動的メモリ要件はヒープ メモリを使用して満たされるため、malloc() 関数はヒープ内にメモリを割り当て、そこへのポインタも返します。ヒープ メモリは非常に限られているため、コードが実行を開始すると、使用中のメモリにマークが付けられ、コードがタスクを完了すると、free() 関数を使用してメモリが解放されます。十分なメモリが利用できず、コードがメモリにアクセスしようとすると、malloc() 関数は NULL ポインタを返します。 malloc() 関数によって割り当てられたメモリは、free() 関数を使用して割り当てを解除できます。

例を通して理解しましょう。

 #include #include using namespace std; int main() { int len; // variable declaration std::cout &lt;&lt; &apos;Enter the count of numbers :&apos; &lt;&gt; len; int *ptr; // pointer variable declaration ptr=(int*) malloc(sizeof(int)*len); // allocating memory to the poiner variable for(int i=0;i<len;i++) { std::cout << \'enter a number : \' <> *(ptr+i); } std::cout &lt;&lt; &apos;Entered elements are : &apos; &lt;&lt; std::endl; for(int i=0;i<len;i++) { std::cout << *(ptr+i) std::endl; } free(ptr); return 0; < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-2.webp" alt="malloc() vs new in C++"> <p>If we do not use the <strong>free()</strong> function at the correct place, then it can lead to the cause of the dangling pointer. <strong>Let&apos;s understand this scenario through an example.</strong> </p> <pre> #include #include using namespace std; int *func() { int *p; p=(int*) malloc(sizeof(int)); free(p); return p; } int main() { int *ptr; ptr=func(); free(ptr); return 0; } </pre> <p>In the above code, we are calling the func() function. The func() function returns the integer pointer. Inside the func() function, we have declared a *p pointer, and the memory is allocated to this pointer variable using malloc() function. In this case, we are returning the pointer whose memory is already released. The ptr is a dangling pointer as it is pointing to the released memory location. Or we can say ptr is referring to that memory which is not pointed by the pointer.</p> <p>Till now, we get to know about the new operator and the malloc() function. Now, we will see the differences between the new operator and the malloc() function.</p> <h3>Differences between the malloc() and new</h3> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-3.webp" alt="malloc() vs new in C++"> <ul> <li>The new operator constructs an object, i.e., it calls the constructor to initialize an object while <strong>malloc()</strong> function does not call the constructor. The new operator invokes the constructor, and the delete operator invokes the destructor to destroy the object. This is the biggest difference between the malloc() and new.</li> <li>The new is an operator, while malloc() is a predefined function in the stdlib header file.</li> <li>The operator new can be overloaded while the malloc() function cannot be overloaded.</li> <li>If the sufficient memory is not available in a heap, then the new operator will throw an exception while the malloc() function returns a NULL pointer.</li> <li>In the new operator, we need to specify the number of objects to be allocated while in malloc() function, we need to specify the number of bytes to be allocated.</li> <li>In the case of a new operator, we have to use the delete operator to deallocate the memory. But in the case of malloc() function, we have to use the free() function to deallocate the memory.</li> </ul> <p> <strong>Syntax of new operator</strong> </p> <pre> type reference_variable = new type name; </pre> <p> <strong>where,</strong> </p> <p> <strong>type:</strong> It defines the data type of the reference variable.</p> <p> <strong>reference_variable:</strong> It is the name of the pointer variable.</p> <p> <strong>new:</strong> It is an operator used for allocating the memory.</p> <p> <strong>type name:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = new int; </pre> <p>In the above statements, we are declaring an integer pointer variable. The statement <strong>p = new int;</strong> allocates the memory space for an integer variable.</p> <p> <strong>Syntax of malloc() is given below:</strong> </p> <pre> int *ptr = (data_type*) malloc(sizeof(data_type)); </pre> <p> <strong>ptr:</strong> It is a pointer variable.</p> <p> <strong>data_type:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = (int *) malloc(sizeof(int)) </pre> <p>The above statement will allocate the memory for an integer variable in a heap, and then stores the address of the reserved memory in &apos;p&apos; variable.</p> <ul> <li>On the other hand, the memory allocated using malloc() function can be deallocated using the free() function.</li> <li>Once the memory is allocated using the new operator, then it cannot be resized. On the other hand, the memory is allocated using malloc() function; then, it can be reallocated using realloc() function.</li> <li>The execution time of new is less than the malloc() function as new is a construct, and malloc is a function.</li> <li>The new operator does not return the separate pointer variable; it returns the address of the newly created object. On the other hand, the malloc() function returns the void pointer which can be further typecast in a specified type.</li> </ul> <hr></len;i++)></len;i++)>

上記のコードでは、 func() 関数を呼び出しています。 func() 関数は整数ポインタを返します。 func() 関数内で *p ポインタを宣言し、malloc() 関数を使用してメモリがこのポインタ変数に割り当てられます。この場合、メモリがすでに解放されているポインタを返します。 ptr は解放されたメモリ位置を指しているため、ダングリング ポインタです。あるいは、ptr はポインタによって指されていないメモリを参照しているとも言えます。

ここまでで、new 演算子と malloc() 関数について説明しました。次に、 new 演算子と malloc() 関数の違いを見てみましょう。

malloc() と new の違い

C++ の malloc() と new の比較
  • new 演算子はオブジェクトを構築します。つまり、コンストラクターを呼び出してオブジェクトを初期化します。 malloc() 関数はコンストラクターを呼び出しません。 new 演算子はコンストラクターを呼び出し、delete 演算子はデストラクターを呼び出してオブジェクトを破棄します。これが malloc() と new の最大の違いです。
  • new は演算子であり、malloc() は stdlib ヘッダー ファイル内の事前定義された関数です。
  • 演算子 new はオーバーロードできますが、malloc() 関数はオーバーロードできません。
  • ヒープ内に十分なメモリがない場合、new 演算子は例外をスローし、malloc() 関数は NULL ポインタを返します。
  • new 演算子では、割り当てるオブジェクトの数を指定する必要がありますが、malloc() 関数では、割り当てるバイト数を指定する必要があります。
  • new 演算子の場合、delete 演算子を使用してメモリの割り当てを解除する必要があります。ただし、malloc() 関数の場合は、free() 関数を使用してメモリの割り当てを解除する必要があります。

新しい演算子の構文

 type reference_variable = new type name; 

どこ、

タイプ: 参照変数のデータ型を定義します。

活字セット

参照変数: ポインタ変数の名前です。

新しい: メモリを割り当てるために使用される演算子です。

型名: 任意の基本的なデータ型を使用できます。

例えば、

 int *p; p = new int; 

上記のステートメントでは、整数ポインター変数を宣言しています。声明 p = 新しい整数; 整数変数にメモリ空間を割り当てます。

malloc() の構文は次のとおりです。

 int *ptr = (data_type*) malloc(sizeof(data_type)); 

ポイント: ポインタ変数です。

データ・タイプ: 任意の基本的なデータ型を使用できます。

java ハズネクスト

例えば、

 int *p; p = (int *) malloc(sizeof(int)) 

上記のステートメントは、ヒープ内の整数変数にメモリを割り当て、予約されたメモリのアドレスを変数 'p' に格納します。

  • 一方、malloc() 関数を使用して割り当てられたメモリは、free() 関数を使用して割り当てを解除できます。
  • new 演算子を使用してメモリが割り当てられると、サイズを変更することはできません。一方、メモリは malloc() 関数を使用して割り当てられます。その後、realloc() 関数を使用して再割り当てできます。
  • new は構造体であり、malloc は関数であるため、new の実行時間は malloc() 関数よりも短くなります。
  • new 演算子は個別のポインター変数を返しません。新しく作成されたオブジェクトのアドレスを返します。一方、malloc() 関数は、指定された型にさらに型キャストできる void ポインターを返します。