2013年9月23日月曜日

メモリの確保と解放の話

これまでの記事で、クラスからオブジェクトを生成する際、
変数宣言と同じような書き方をしていました。
この方法では、普通に変数宣言したのと同様に、オブジェクト用のメモリは
プログラム実行時に自動的に確保されます。
このようなメモリ確保は、静的なメモリ確保といいます。

一方で、プログラム実行時の条件やユーザからの入力内容に応じて、
メモリを確保したい場合があります。実務でもこちらの使い方が大半です。
このような実行時の状況に応じて、プログラムの処理上でメモリを確保する事を
動的なメモリ確保といいます。

例えば、読み込んだ画像を右に90度回転させて表示させるプログラムというものを
考えてみます。
このようなプログラムでは、実行時に使用する画像は横長の長方形かもしれませんし、
あるいは正方形かもしれません。
様々なサイズに対応することを考えると、あらかじめ読み込む画像の大きさを
決めることができません。

あらかじめ非常に大きなメモリを確保して、大半の画像を読み込めるようにして
対応することも可能ですが、それはとても非効率です。

実際にプログラムを動かす環境は、最近のPCなどとは違い、搭載メモリが128メガ
だったりします。読み込み画像だけのためにほとんどを使ってしまうと、他の処理が
使えるメモリが少なくなってしまいます。
仮に今それでよかったとしても、将来の機能追加を考えると...です。(-_-;)

ちなみに搭載メモリを増やすという解決策はNGです。(>_<)
コストが高くなるため、作り手と買い手、どちらにとっても嬉しい結果になりません。
喜ぶのはメモリ製造会社だけ!?

そんなわけで、普通は実行時の画像サイズや色数をもとに確保するメモリ量を
変えるようにするのです。いわゆる業界の常識というやつですね。

オブジェクトも、動的なメモリ確保によって生成できます。
このとき使うのがnew演算子です。そして、動的に生成したオブジェクトを解放する
ときはdelete演算子を使います。
これは、C言語のメモリ確保/解放関数のmalloc()/free()と同じ関係にあります。

C++でもmalloc/freeは使えますが、newとfree(), malloc()とdeleteといった混ぜて
使うようなことはできませんので注意してください。
newとdelete、malloc()とfree()というようにそれぞれでセットになります。

今日の名言
天才の生み出すものは、すべて熱中の産物に違いない。
                                  ベンジャミン・ディズレーリ

もし私に涙を流させたければ、まず君自身が苦痛を感じることだ。
                                  ホラティウス

私は移民の子であったので、頑迷、思いやりのなさ、偏見のすべてをなめ尽くした。
だが、私は苦しまなかった。むしろ一段と努力に励むための鞭だと考えた。
                                  バーナード・バルーク

失敗は一種の教育である。「思考」とは何であるか知っている人間は、成功からも
失敗からも、非常に多くの事を学ぶ。
                                  ジョン・デューイ

私は災難の起こるたびに、これを良い機会に変えようと努力し続けてきた。
                                   ジョン・D・ロックフェラー