参照カウンタ

みんなが夏休みとってるときに、会社で何やってるかって言うと、あれだ。デバッグ。

担当プロジェクトではないんだけど、まぁ顧客テスト中に発生したエラーの原因が分からず、空いてる人で再現テストとかするという、よくあるあれです。特に連休前によく発生するのはなぜか?

それはともかく、そのエラーの内容というのがOLEオートメーションエラーというやつで、詳細エラーメッセージが「起動されたオブジェクトはクライアントから切断されました」という、「なんなんだ!責任者出てこい!」状態の、これもWindowsではよくあるパターン。

正確な原因が分かってないので、これから書くことは間違ってるのかも知れないけど、まあ書いておこう。

これってのはCOM関係のエラーらしいのです。正確に言えば、上記のメッセージはRPC(Remote Procedue Call)関係なので、DCOMかも知れませんが。COMってのはご存じの通り(かどうか知らないが)、あれです、参照カウンタを使ってオブジェクトの管理をしてるんです。

で、おそらく、参照を保持している側から、参照される側のオブジェクトのメソッドを呼び出したのはいいが、参照される側はすでに解放されちゃってる、とかいうパターンなんです。おそらく。まだ再現すらしてないんですが。

参照カウンタと言えば、Objective-CというかCocoaも参照カウンタでオブジェクトを管理しています。

要はオブジェクトが誰からも参照されなくなったら(参照カウンタが0になったら)勝手にオブジェクトが解放されるので、どこでオブジェクトを作ってどこでオブジェクトを解放するかを設計しなくてもよくなる、ってことなんですが。

現実はそんなに甘くなくて、参照カウンタの上げ下げを各所できっちり作り込んでおかなければならず、これでミスすると原因が究明しにくくなるという問題があります。

Objective-CはC++と異なり、演算子のオーバーライドがないので、スマートポインタのようなものは作れませんが、拡張子を.mmにすることでObjective-C++になって、C++の機能も使えるようになるため、C++のスマートポインタのようなものを導入することも可能です。

ですが、あれです。

やっぱりきっちり設計して、きっちりドキュメント化しないと参照カウンタとかスマートポインタってうまくいかないんです。

どういうケースで参照カウンタがカウントアップされて、どういうケースでカウントダウンされるか。どのメソッドは参照カウンタをどういう状態にして返すか。

Visual Basicもやはり、参照カウンタを使っているのですが、デバッグするのはCがいいなと思います。参照カウンタがどう遷移しているか見たいもの。