第5回はC++の動的なメモリの確保についてです なぜ、動的なメモリ確保が必要になるのか? そもそも動的な確保ってなにさ?って話をします。 通常、変数を宣言時 何も考えなくてもその変数の暗黙のメモリ領域が確保されます(自動変数という) Visual Studio2005,2008環境下での C++変数のint型、float型は4バイトになっています。 ある変数(関数)がどれだけのメモリ容量を確保しているかは sizeof()演算子で調べることができます。 当然ながら、確保している変数の要領を超えた量は保存できません 4バイトなら1バイト8ビットなので 2の32乗分の数値が判別できますが これを超える数値は判別できず、そのような数値を代入した場合 おかしなことになります。 一番わかりやすい例は 配列の範囲外にアクセスすることです int a[10]; とした場合, a[0]〜a[9]までの変数がつかえますが a[10],a[11],a[-1]など配列の宣言した範囲外を使おうとした場合 メモリが確保されておらず、アクセスできずエラーになります 配列というデータ構造は 連続したアドレスにメモリを確保しています これによりa[0]やa[1]など 高速に変数にアクセスすることが可能になっています (連続でないデータ構造にはリストや木などがあります) 配列の長所としてはアドレスに直接アクセスできるため高速です 配列の欠点としては連続配置されているため挿入、削除をされると 並びなおし(ソート)に時間がかかるという点です さて、動的なメモリ確保の話にもどりますが、 プログラムの途中で使えるメモリ領域を増やしたいな と思う場合があります たとえば、使える配列の量を増やしたいなという場合です。 動的なメモリを確保するためには 確保したい変数型のポインタを用意します newキーワードを使います int型ならば int *a = new int; とするとint型変数のサイズ分メモリ領域が確保されます 動的に確保したメモリは必ず解放しなければなりません 解放するためには deleteキーワードを使います これは変数の型によらず delete a;//←aは任意の変数型のポインタ で解放できます 配列でも動的なメモリは確保できます int型のデータを100個もつ配列を作りたい場合は int *a = new int[100]; 配列の場合の解放は delete[] a;//←aは任意の変数型のポインタ で行います 使い終わったら必ずnewしたメモリはdelete、delete[]で解放をしてください これを行わないとプログラム終了時にメモリが解放されず プログラムを起動ごとに使えるメモリ領域が減っていきます (メモリリークという) 特に携帯電話などメモリ使用が限られている環境でこれをやると致命的です プログラムを起動し続けるとメモリ容量がなくなり、プログラムが止まることになります メモリは資源だという認識を常に頭にいれておいてください ここではとりあえず、配列の動的確保について説明します 単体でメモリ確保していくのはリストや木などのデータ構造に用いられるのですが、 それについては俺の余力があったらいつか説明します #include <iostream> using namespace std; int main() { // int型ポインタ int *memory; // int型を配列で100個分確保 memory = new int[100]; for(int i = 0;i < 100;++i) { memory[i] = i; cout << memory[i] << endl; } // 使わなくなったり、再確保したかったりする場合は必ずメモリ解放 delete[] memory; // int型を配列で200個分確保 memory = new int[200]; for(int i = 0;i < 200;++i) { memory[i] = i; cout << memory[i] << endl; } // 使わなくなったり、再確保したかったりする場合は必ずメモリ解放 delete[] memory; return 0; } newキーワードの利点はC言語でのmalloc関数と違い メモリ領域確保のためのデータ型のサイズをいちいち調べなくていい点です C++にはこれとは別にvectorという可変長配列のテンプレートクラスを使う方法 がありますが、配列の動的確保はファイル読み込みとかで 必要なデータ数がファイルによって異なる場合とか重宝します #vote((^ω^)わかったお[4],普通[0],。(`ω´#)。わかりにくぃぜぇえええええ[0])