COMとは?
COM (Component Object Model)は、Windowsで使われているオブジェクト間通の仕組み
たとえば:
- IFileOpenDialog→ファイルダイアログを表すオプジェクト
- IShellItem → ファイルやフォルダを抽象的に表すオブジェクト
これらは「COMオブジェクト」であり、実体は内部的にはクラスのインスタンスです。
COMのメモリ管理のしくみ
COMでは、オブジェクトを誰が使っているかを追跡するために「参照カウント(Reference Count)」というしくみを使います。
よくある流れ:
|
1 2 3 |
IFileOpenDialog* pDialog = nullptr; CoCreateInstance(..., &pDialog); // COMオブジェクト作成 → 参照カウント1 pDialog->Release(); // 参照カウント減 → 0になればオブジェクト自動削除 |
- 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が提供するしくみの上にあるメモリオブジェクトというのが正確です。
画像メモ


コメント