2007年8月28日火曜日

どうやらだめらしい

昨日のポストで書いたコードですが、どうやらメモリリークの原因となりそうです。やっぱり、どんな形であれmalloc/newしたならfree/deleteしなさいということらしいですね。
安易に領域を確保してreturnするような関数を書いて利用するなってことですか。やはり自分でメモリ管理をするのは苦手です、トホホ^^;
というか、newやdeleteも演算子であるため、オーバーロードが可能であることに驚き。さらに、メモリリークについて調べていて参考にしたサイトには
「C++ならば自分の扱うクラス全てを派生させるスーパークラスがあるだろう。と言うか、普通はそのように実装する」
って書いてあってびっくり。マジすか。いわゆるJavaで言うところのObjectクラスを自前で用意するのがC++プログラマにとっては常識だったんすか。己の至らなさに目からウロコですよOrz
けど確かに理には適ってるな。なるほどさすればスーパークラスのnewとdeleteをオーバーロードして、確保と解放がきちんと対になっているかを調べられるように実装するのは可能だよな。JavaやC#のガベッジコレクションも考え方の基本はここにあるのかも知れない。
ただ、C++にて配列を確保したり解放した場合は問答無用でグローバルなnewとdeleteが呼ばれるらしい。自前のクラスの配列を用意したときなどはきちんと解放されているかを自分で管理しなくてはいけないのはCと同じところか。
もうちょっとこのことについて気付いていれば今回のC#からC++へのプログラムの移植でもスーパークラスについて考えておいたんだけどなぁ。まぁまだデッドラインまでは時間もあるし、考慮してみるのも面白いかも知れない。
別に凝った機能が必要なわけではないモノね。まーnewとdeleteのオーバーロードあたりでも用意してやりましょうか。仮想関数にしないとまずそうやな。というかそのスーパークラス自体が仮想クラスにしておかないとまずいか。仮想クラスにしたらそこに含まれるメソッドは自動的に仮想関数になると思っていていいのかしら・・・?
もうちょいとC++を勉強する必要がありそうだな、うん。