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の方が安全で便利です。
-
C/C++のmemcpy()関数の使い方と実例解説
この記事では、C++ STLにおけるmemcpy()関数の動作、構文、および具体的な使用例について詳しく解説します。 memcpy()とは? memcpy()関数は、C++ STLに組み込まれた標準関数の一つで、<cstring>ヘッダーファイルで定義されています。この関数はメモリブロックをコピーするために使用され、あるメモリ位置から別のメモリ位置へ、指定されたバイト数分のデータを転送します。 関数の実行結果は、データのバイナリコピーとなります。重要な点として、memcpy()は終端のNULL文字やその他の終端記号をチェックしません。単純にソースから指定されたバイト数(num)をそ
-
C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説
AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ