Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++におけるmalloc()とnew()の違いと使い方を徹底解説


malloc()とは

malloc()関数は、要求されたサイズのバイト数分のメモリを割り当て、割り当てられたメモリ領域の先頭バイトへのポインタを返します。メモリの割り当てに失敗した場合は、NULLポインタを返します。

C++言語におけるmalloc()の構文は以下の通りです。

pointer_name = (cast-type*) malloc(size);

各パラメータの意味は次の通りです。

pointer_name − ポインタ変数に付ける任意の名前です。

cast-type − malloc()で割り当てたメモリをキャストするデータ型です。

size − 割り当てるメモリのサイズ(バイト単位)です。

以下は、C言語でのmalloc()の使用例です。

サンプルコード

#include <stdio.h>
#include <stdlib.h>
int main() {
   int n = 4, i, *p, s = 0;
   p = (int*) malloc(n * sizeof(int));
   if(p == NULL) {
      printf("\nError! memory not allocated.");
      exit(0);
   }
   printf("\nEnter elements of array : ");
   for(i = 0; i < n; ++i) {
      scanf("%d", p + i);
      s += *(p + i);
   }
   printf("\nSum : %d", s);
   return 0;
}

実行結果は以下の通りです。

Enter elements of array : 32 23 21 8
Sum : 84

上記のプログラムでは、4つの変数が宣言されており、そのうちの1つであるポインタ変数*pが、malloc()によって割り当てられたメモリを格納しています。このプログラムは、ユーザーが入力した配列要素の合計値を出力します。

int n = 4, i, *p, s = 0;
p = (int*) malloc(n * sizeof(int));
if(p == NULL) {
   printf("\nError! memory not allocated.");
   exit(0);
}
printf("\nEnter elements of array : ");
for(i = 0; i < n; ++i) {
   scanf("%d", p + i);
   s += *(p + i);
}
printf("\nSum : %d", s);

new演算子とは

new演算子は、ヒープ領域へのメモリ割り当てを要求します。十分なメモリが利用可能であれば、そのメモリをポインタ変数に対して初期化し、そのアドレスを返します。

C++言語におけるnew演算子の基本構文は以下の通りです。

pointer_variable = new datatype;

メモリを初期化しながら割り当てる場合の構文は次の通りです。

pointer_variable = new datatype(value);

連続したメモリブロックを割り当てる場合の構文は次の通りです。

pointer_variable = new datatype[size];

以下は、C++言語でのnew演算子の使用例です。

サンプルコード

#include <iostream>
using namespace std;
int main () {
   int *ptr1 = NULL;
   ptr1 = new int;
   float *ptr2 = new float(223.324);
   int *ptr3 = new int[28];
   *ptr1 = 28;
   cout << "Value of pointer variable 1 : " << *ptr1 << endl;
   cout << "Value of pointer variable 2 : " << *ptr2 << endl;
   if (!ptr3)
   cout << "Allocation of memory failed\n";
   else {
      for (int i = 10; i < 15; i++)
      ptr3[i] = i+1;

      cout << "Value to store in block of memory: ";
      for (int i = 10; i < 15; i++)
      cout << ptr3[i] << " ";
   }
   return 0;
}

実行結果

Value of pointer variable 1 : 28
Value of pointer variable 2 : 223.324
Value to store in block of memory: 11 12 13 14 15

上記のプログラムでは、ptr1、ptr2、ptr3という3つのポインタ変数が宣言されています。ptr1とptr2はnew演算子を使って値を代入して初期化され、ptr3はnew演算子によって割り当てられたメモリブロックを格納しています。

ptr1 = new int;
float *ptr2 = new float(223.324);
int *ptr3 = new int[28];
*ptr1 = 28;

malloc()とnew()の主な違い

どちらもヒープ領域から動的にメモリを確保するために使われますが、両者にはいくつか重要な違いがあります。用途に応じて適切な方を選択しましょう。

項目malloc()new
種類関数(<stdlib.h>が必要)C++の演算子
戻り値void*型のためキャストが必要指定した型のポインタを返す
失敗時の挙動NULLを返すstd::bad_alloc例外をスローする
コンストラクタ呼び出し呼び出さないオブジェクト生成時に呼び出す
サイズの指定バイト数をsizeofなどで明示的に計算型に基づき自動的に計算される
メモリの解放free()関数を使用delete演算子を使用

C言語との互換性が必要な場合はmalloc()を、C++でオブジェクト指向的なコードを書く場合はnew演算子を使うのが一般的です。特にクラスオブジェクトを扱う際には、コンストラクタが自動的に呼ばれるnewの方が安全で便利です。

  1. C/C++のmemcpy()関数の使い方と実例解説

    この記事では、C++ STLにおけるmemcpy()関数の動作、構文、および具体的な使用例について詳しく解説します。 memcpy()とは? memcpy()関数は、C++ STLに組み込まれた標準関数の一つで、<cstring>ヘッダーファイルで定義されています。この関数はメモリブロックをコピーするために使用され、あるメモリ位置から別のメモリ位置へ、指定されたバイト数分のデータを転送します。 関数の実行結果は、データのバイナリコピーとなります。重要な点として、memcpy()は終端のNULL文字やその他の終端記号をチェックしません。単純にソースから指定されたバイト数(num)をそ

  2. C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説

    AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ