memo/20080418
created 2008-04-18 modified 2008-04-25
弱い参照について。
リンク | 備考 |
---|---|
弱参照でメモリー・リークを塞ぐ |
もうさ、そこまでしてGC技術にこだわる理由ってあるのか?
この記事のキモって、参照されてるモノ(記事ではSocket)のライフタイムが終了したことをフックしたいってことでしょ?
でもSocketのデストラクタソースを改造する気力もなし。Socketを使ってるライブラリなりフレームワークの成果をいただいておきながら、面倒に巻き込まれるのはイヤと。
なら、そのSocketを含んでる何らかのライブラリやフレームワークの提供者に、フックを提供してよ、って政治的に動くのがまず前提じゃないかね。で、それもイヤと。
(まぁライブラリ提供者だって、フック提供してよと言われても、イヤだし無理だろう)
ていうかそもそも、GC言語なのに、事実上はC的なポインタが必要になる場面があるってことを、この記事の著者自身が冒頭で言ってるじゃんぬ。それがつまりおいらの感想では、GCパラダイスは破綻してるってことだと思うのだがうーぬ。
さっさとGC技術をあきらめて、非GC言語で「リソース開放漏れを防ぐ設計ノウハウの浸透」に注力してくれないかな。
そのほうが、オレが個人的に幸せになれるという直感があるんだが、根拠不明。
追記:「リソース開放漏れを防ぐ設計ノウハウ」の具体例
動的メモリを使わない
(1)自動変数なら、例外で抜けても言語が責任を持って解放してくれる。極力自動変数を使う(クラスオブジェクトも)。(2)オートポインタの類を上手に使う。別に汎用のauto_ptr< >とかじゃなくてもぜんぜんOk。デストラクタでメンバを開放する専用のクラス一個つくればいいだけ。
大事なものはちゃんと管理しる
オブジェクトの生成、削除がメソッド内に閉じないようなものは、そのソフトウェアの重要な設計項目であるはず。(1)ならそれはちゃんとドキュメント化すべき。ドキュメントが長大になるなら概要設計がよくない。
(2)マネージャが責任をもつようにつくる。マネージャを含むフレームワークが分かりにくいなら概要設計がよくない。
あれだよね。「Javaには、ポインタが無い」は間違いで、「Javaでは構造体やクラスはポインタでしか使えない」なんだよね。
C#なんか、ポインタやらGCというソフトウェア技術をきちんと理解してないと、きちんとオブジェクトの終了処理を書けないし。何のためのGC?と。