前2回でメモリの動的確保についてやってきました。では、動的確保はどのようなときに使えばいいのでしょうか? 今回はそういうお話です。
では、今回の要点です。
では、いってみましょう。
前回、フィボナッチ数列を作りました。そのとき、配列の動的確保を行いましたね。このときの配列のサイズは、入力した数値によって変わってきました。これが、動的確保の第1の利用法です。
つまり、メモリの動的確保を使うと、配列のサイズを実行中に決めることができるのです。こういった配列を可変長配列と呼びます。
これはとても便利です。今までなら、フィボナッチ数列を計算し、これを保存しておくとしても、保存できる個数は確保した配列のサイズ以内に限定されてしまいました。何と、この制限がなくなるのです。もちろん、メモリがなくなってしまえば確保できなくなってしまいますが。
次は、第61章で話したスタックオーバーフローに関する話です。
自動変数で巨大な配列変数を作ると自動変数用の領域をあふれてしまい、スタックオーバーフローというエラーが起こってしまいます。スタックオーバーフローになると、そのあふれた先にたまたまあったメモリ領域を使うことになります。そこに書き込みを行うと、たまたまそこにあった変数などの値を変えてしまいます。
スタックオーバーフローが起こるとすぐにエラーが起こるわけではありません。こうして別の変数の値を変えて、それが原因でたまたま何か変な動作が起きて、そして初めてエラーが発生するのです。もしくは、書き込んではいけない領域に書き込んでしまい、エラー終了することもあるでしょう。ですが、このときたまたまきちんと動けばスタックオーバーフローに気付くことはないでしょう。
このため、スタックオーバーフローはプログラムのバグにおいて3本の指に入る最悪なバグです。
このような大きな配列を作るときは動的に確保します。大きな配列なのでメモリが足りないときもあるでしょう。そういうときもプログラムの起動はでき、その時の動作をきちんと記述することができます。
ここでグローバル変数として確保してしまうと、プログラムの起動自体ができなくなってしまいます。グローバル変数のメモリを確保するのは、プログラムを起動するその時だからです。巨大な配列を必要とする機能がそのソフトの単なる1機能な時であっても、グローバル変数にしてしまうと他の全ての機能も利用できなくなってしまいます。これは最早バグです。
このように、メモリの動的確保を使えば大きな配列も安全に作成することができるのです。
最後は寿命の話です。
第68章で話したように、変数には寿命があります。では、動的に確保したメモリの寿命はどうなるのでしょうか?
これは簡単ですね。new してから delete されるまでです。つまり、delete されるまではメモリの内容は保証されるわけですね。
このことから分かるとおり、new で確保したメモリの寿命はブロックには左右されません。ブロックを超えた自由な寿命を持つわけです。delete するタイミングを調整すれば、寿命をコントロールできるわけです。
このように、ブロックを超えた自由な寿命を持たせたいときに、メモリの動的確保が利用できるのです。
ただし、この場合は注意しないとメモリリークが起こる可能性があります。こういった使い方を行う場合はメモリリークに十分注意して下さい。
今回はこれだけです。今までの反動でしょうか、短いですね。
それでは、今回の要点です。
3回なかなか重要な事をしてしんどかったので、次回はとても簡単な章にします。息抜きにどうぞ。
Last update was done on 2000.7.29
この講座の著作権はロベールが保有しています