スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++とDirectX弄りの備忘録(1)

中途半端に暇だということが判明した。言い換えると、5日だと思ってた猶予は2週間ある。
そしてりテイクを繰り返した結果ソースコードが膨大になりすぎて管理ができない。
ので自分の脳内整理を含めて一つづつ情報を残しておくことにした。
書けば覚える、書かなきゃ覚えない。バグが出てもあきらめない。
効率がいい、これこっちの方がいいんじゃね、ってのがあったら教えてください。

1.名前空間
今回適当にやってみてわかったのは意外と名前衝突は起こる可能性が高いということ。
これを回避する方法、および同一目的の関数群やグローバル定数などをパッキングする目的として、
C++には名前空間が存在する。よってこれを自作のクラスおよび関数には設定することにした。
また、テストを目的とするなどでない限り、標準ライブラリの名前空間stdに関して
usingディレクテブ・宣言を使用してはならない。
ある程度のブロックが限定された中での使用は、場合によっては冗長になるためやむを得ないが、
グローバルエリアでのこれは、その後にインクルードされたすべてのヘッダおよびソースで
有効になってしまうという関係上絶対にやってはならない。


2.コンストラクタとデストラクタ
コンストラクタでは失敗を通知する方法として、戻り値が存在しない以上例外を利用するしかない。
もしくはis_succeedみたいなメソッドを設けて作成後に成否を見るというのもあるが。
どちらにせよコンストラクタには、例外の発生があるものとして使用を心掛ける。
しかしnewおよびmallocで確保されたメモリに関しては、これらをもれなく解放しなければならない。
基本的にWindowsの環境下であれば、プロセス終了とともに割り当てられたすべてのリソースは解放されるため、
終了時にはメモリリークが起こっていても問題はないが、定期的に生成されるオブジェクトにおいて、
これが発生することはリソースを食いつぶすことにつながりシステムの安定性を低下させる。
また、ゲーム機とかPICとかみたいに組み込み向けに作るならリークした時点でまずいと思う。

よってこれを回避するためにデストラクタを用いる。
デストラクタが呼ばれる条件は、オブジェクトがスコープから外れるときおよびdelete式であるが、
前者を利用してnewで確保したメモリのポインタに関しての管理を別オブジェクトに移譲する。
例えばstd::auto_ptrとか。C++にはJavaみたいに例外仕様にfinallyが存在しないため、
なるべくヒープから確保したメモリに関しては、そいつらのデストラクタと道連れに死んでもらう。
だからなるべくnewで確保した生ポインタを使用せず、scoped_aryだったりsmart_ptrを使う。
これによって、上位のクラスほどデストラクタでの解放処理を書く必要がなくなる。

続きを読む

スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。