[ VC++ ] メモリ領域の動的確保と解放( new, delete 演算子)

Pocket

C言語でメモリの動的確保を行いたい場合は、malloc と free 関数を使用していました。c++ はC言語もサポートしているので同じように malloc, free 関数を使用することができますが、c++ ではクラスなどのインスタンス化を行う場合は、new 演算子を使用しますので、メモリも new 演算子で確保することが多いです。

スポンサーリンク

c言語でメモリの動的確保サンプル

 // メモリの動的確保
 char* buf = (char*)malloc(10);

 /*
  * 何かの処理
  */

 // メモリの解放
 free(buf);

なお、malloc 関数ではなく calloc 関数を使用することで、確保した領域をすべてのビットが 0 に初期化されます。

 // メモリの動的確保と初期化
 char* buf = (char*)malloc(10);
 // 取得した領域の中身は不定なので、明示的に全ビットを 0 で初期化する
 memset(buf, 0, 10);

 // char型のサイズの10個分の連続したメモリを確保する
 // 取得した領域は全ビットが 0 で初期化されている
 char* buf0 = (char*)calloc(10, sizeof(char));

c++でメモリの動的確保サンプル

 // 配列で動的確保を行う場合
 char* buf = new char[10];
 // 配列の領域を解放する [] をつける
 delete[] buf;

 // 固定サイズの領域を確保する場合
 int* int_buf = new int;
 // 固定サイズの領域を解放
 delete int_buf;

new 演算子での領域確保の利点としては、キャストの必要がないことだと思われます。構造体などの領域確保の場合などで良くわかりますが malloc 関数で確保した場合には、static_cast< strunct_xxx *>  や (strunct_xxx *) のようにキャストして使用しなければいけません。

誰もが一度は通る道

c 言語であろうと c++ であろうと、以下のように領域を確保して勝手に開放してくれることを同時に期待して、下記のようなプログラムを書いてみるのではないでしょうか。

 int buf_size = 10;  // 確保したいサイズを設定
 char buf[buf_size]; // 動的に確保

しかし、残念ながらコンパイルエラーとなりますね。以下は Visual Studio 2010 で出力されたエラー内容です。

エラー 1 error C2057: 定数式が必要です。
エラー 2 error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。
エラー 3 error C2133: ‘buf’ : サイズが不明です。

都合よくいかないものですね。人生ってやつは。。。

スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>