FlexGrid 6.0J メモリリーク対応
FlexGrid6.0J 8.0 で、 Cellプロパティにてフォントを取得する場合に、 メモリリークが発生することが報告されています。 http://www.grapecity.com/japan/spread/P1_223_BugReport.htm
ここで報告されている対処方法は、Cellプロパティを使用せずに、Cell??? プロパティにて、フォント属性を設定するように記述されていますが、この方法だとパフォーマンスに影響してしまいます。(Cellプロパティのメリットがなくなってしまうため)
そこで、そもそもの原因を究明することにより対処することとなりました。 まず、問題点となるのが、なぜメモリリークが発生するのか。
本来、Cell プロパティで取得した フォント情報(IUnknowを継承したCOMオブジェクト)は、それを1回リリースするだけで正常に開放されるはずです。
そこで、Cell プロパティを取得した後の 参照カウントをしらべてみました。 COMに関して知識がないので、下記のようにしらべました。 -------------------------------------------------------- // フォント情報の取得 VARIANT vaFont = getFlexGrid()->GetCell(flexcpFont, ...); // 参照カウントを追加 UINT uiRefValue = vaFont.pdispVal->AddRef(); --------------------------------------------------------
ここで、参照カウントを追加したので、2でなければなりません。 ところが、ここでは、3が帰ってきています。 Cell プロパティの実装中で、参照カウントが余計にあがってしまっていることが推測されます。
対処方法は、参照カウントを1つデクリメントすることとなります。
-------------------------------------------------------- // 通常より1回多く リリース処理を行う UINT uiRefValue = vaFont.pdispVal->Release(); --------------------------------------------------------