犬も猫も空想も扱っておりません。(旧・エト記)この広告は、90日以上更新していないブログに表示しています。スマートポインタを使いなさいというのが,ごく一般的に言われることだと思う*1。JavaやC#などのもう少し先進的な言語にのめり込んで,かつGCの効率の良さを主張する人々は,ガーベージコレクタ(ガベコレ)を使うべきだと言うかも知れない。書くのが第1の方法だとしたら,第2,第3の方法はスマートポインタ,ガベコレを使う方法だろう。shared_ptrのような参照カウンタ方式のスマートポインタの欠点は,相互参照が起こるケースで,お互いのオブジェクトがお互いの参照カウンタをインクリメントしあって,いつまでたっても開放されない,つまりメモリリークが発生することがあるということである。実際メモリリークは起こっていると思うけど,小さいうちは誰も気付かない。あるとき,明らかな桁違いの無駄遣いに気付いて,ようやく発覚する,というのが,過去の運用で体験したことだ(レベル低いかも知れないけど,現場はそんなもんだ)。実際にスマートポインタを使ってみて分かったのは,既存のC++のライブラリは,リソースのマネージャがキッチリ定義されていて,敢えてスマートにせんでも,生ポインタで十分なように作られていて,逆にスマートポインタを混ぜると混乱が起こるということ。いうわけで,スマートポインタは既存のコードへの組み込みという観点でも,リソース管理の問題解決策という観点でも,非常に中途半端で,いまいちスッキリしないんである。前にも書いたかも知れないけど,私の一番のお気に入りのスマートポインタはauto_ptrで,その確信犯的な潔い使い勝手の悪さに,絶妙なバランス感覚を感じてしまう(参考)。ちなみにauto_ptrはC++の中でも「使ってはいけない」リストのかなり上位に入っていると思う。いう意味では,潔くプログラマからリソース管理の責任を取り上げて,ガベコレを導入したほうが,プログラムを組む側としては余計なことを考えなくて済んで,非常にありがたい。実際にそこでガベコレという技術に乗っかれるような人は,そもそもC++なんか使ってないで,さっさとJavaやC#を選ぶので,C++ではまだ主流ではないし,これからもなりにくいと思う。それにベターなCというポジションは絶対に外さないだろうから。C++に対する愚痴になりそうだけど,今となってはC++のターゲットとする分野って広すぎて,浅い。ローレベルなところではCに敵わないし(なにしろOSがCだからな),ハイレベルなところでは新手のオブジェクト指向言語に取って代わられつつある。最速の(高級)オブジェクト指向言語の地位を保っている(と大勢の人に思われている)のが,せめてもの救い。話が明後日の方向に言ったところで,本題に戻る。好きだけど,誰も使っちゃくれない。その他のスマートポインタは糞切れが悪いなガベコレは,まぁ無理だろうなと思って,さらに中途半端なメモリプールという技術をC++で実装してみた。スマートポインタを使う必要も無く,かつ自分でポインタを開放する必要も無い。PoolからサブPoolを作成することもできる。Poolが破棄されるのは,自分自身かその親Poolが破棄されるとき。コーディング規約がアレなのは,Windows向けに書いたものだから。言うと,作ってみたものの,効率面と実装の簡潔さのバランス,あまりいい活用方法等が見つからなかったのでネットにリリースすることにしました。元ネタはAPRのapr_pools.hで,所詮C++でごにょごにょやったところで,Cの簡潔さと実用性を遥かに凌ぐものが作れるかというと,そうでもないというのがよく分かる例になってしまったかもしれません。C++で生計を立てながらも,ちょっくらC++に疲れている人のコードなので,変なところがあるかもしれません。腕に覚えのある人が,もっといいものを書いてくれることを期待します。気になるところは色々ありますが,デストラクタが確実に呼ばれることを考えると,既存のコードでは,サブプールを持つ意味が,あまり無いかも知れないかなと思っています。問題Archiveはてなブログをはじめよう!xoinuさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。