年を取るとC++が難しい
今日一つ成長した。
組み込みプログラマはmallocを使わない。というかmallocが存在しない環境でプログラミングをすることが多い。そうすると、自然にmallocを避けるようにプログラミングしてしまう。同じようにC++でも、newやらdeleteやら使わずに済むなら使いたくない。
と思っていたら間違いに気がついた。
あるインスタンスAの領域が既に確保されているとする。途中でAはもう必要なくて、同じクラス(構造体)の別インスタンスBが必要になったとする。無意識に「Aの領域がもう要らないんだから、Bで上書きして使い回せば良いよね」ってコーディングをしていた。上書きの時に気をつけないと行けないこと事がいくつかあるから、上書きの時にはその関数を必ず呼ぼう。その関数でAが無効になるときの処理を書いて、Bを確実に初期化しよう。バグは出るかもしれないが、少なくともここでメモリリークは起きない。ずっと決まったところを使い回しているんだから。
完全に組み込みプログラマの職業病だ。
この発想がC++のデストラクタ、コンストラクタを台無しにしていることにようやく気がついた。オブジェクト指向なら、Aが必要なくなって新たにBが必要になったら、Aのデストラクタを呼んで、Bのコンストラクタを呼ばないといけない。クラス≠構造体だ。今C++のプロジェクトに放り込まれたら、間違いなくThe 老害になる。
一気にいろいろやると収拾つかなくなりそうだから、変更すべき所はnew、deleteに変更して、ポインターをメンバーに持つクラスはコピー禁止にしよう。仕事ならともかく、趣味のプログラミングで面倒だぜって思ったら10分で修正終了。カプセル化と単体テスト万歳!!!
一応effective C++ 2回目読み切ったけど、もう一回読まないといけないな・・・。
The comments to this entry are closed.
Comments