COM

COMとは?

COM (Component Object Model)は、Windowsで使われているオブジェクト間通の仕組み
たとえば:

  • IFileOpenDialog→ファイルダイアログを表すオプジェクト
  • IShellItem → ファイルやフォルダを抽象的に表すオブジェクト

これらは「COMオブジェクト」であり、実体は内部的にはクラスのインスタンスです。

COMのメモリ管理のしくみ

COMでは、オブジェクトを誰が使っているかを追跡するために「参照カウント(Reference Count)」というしくみを使います。

よくある流れ:

  • CoCreateInstance()などでCOM オブジェクトが生成されると、内部的にnewでインスタンスが作られることが多い(ヒープに相当)。
  • Release()を呼ぶことで、参照カウントが1つ減る
  • 0になると、そのCOMオブジェクトが自動的に破棄される( delete this;相当)

COMオブジェクトは「OS内部のリソース」なのか?

  • 部分的には OSが用意しているインフラの上で動くオブジェクトです。
  • しかし、GDIリソースのように「限られた枠」ではなく、動的にメモリが割り当てられることが多い。
  • つまり:
    • メモリは確保される(主にヒープ)
    • osが管理しているコードが使われる
    • だから Release()しないとメモリリークする

GDIリソースとの違いまとめ

項目COMオブジェクト(IUnknown )GDIオブジェクト(HDC.ペンなど)
生成場所主にヒープ領域(new 相当)
解放方法Release()(参照カウント0で自動解放)Deleteobject()ReleaseDc()など明示的
リークの影響メモリリーク(通常はアプリ内で収まる)GDI枯渇→他のアプリも描画不能になる可能性

補足:COMはGCではない!

  • COMは自動で回収される仕組み(Garbage Collection)はありません。
  • 代わりに「自分が使わなくなったらRelease()を呼ぶ」のが鉄則。

まとめると

  • IUnknownを継承するCOMオブジェクトは多くの場合ヒープに割り当てられる。
  • Release()は、「自分はもうこのオブジェクトを使わないよ」と通知するためのもの。
  • OS内部のリソースというより、OSが提供するしくみの上にあるメモリオブジェクトというのが正確です。

画像メモ

com query

コメント

タイトルとURLをコピーしました