- 追加された行はこの色です。
- 削除された行はこの色です。
第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関数と違い
データ型のサイズをいちいち調べなくていい点です