COM/Directオブジェクトの解放

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

COM/Directオブジェクトの解放

投稿記事 by naohiro19 » 11年前

Component Object Model(COM、Wikipediaの記事)やDirectXといったオブジェクトを管理するのは
AddRefメソッドやReleaseメソッドを利用しますが、はっきり言うとboost::intrusive_ptrを使うほうが簡単です。

CODE:

//Deleter.h
#pragma once

#include 
#include 

inline 
void intrusive_ptr_add_ref(IUnknown* ptr) {
	assert(ptr);
	ptr->AddRef();
}

inline 
void intrusive_ptr_release(IUnknown* ptr) {
	assert(ptr);
	ptr->Release();
}
という上げ下げする関数を書いておいて、

クラスのメンバー変数に以下のようなものを用意しておけば

CODE:

boost::intrusive_ptr lpD3D9;
boost::intrusive_ptrが自動で上げ下げ(intrusive_ptr_add_ref/intrusive_ptr_releaseを自動で呼び出してくれる)してくれるのでdeleteを使うときのマクロを書くことはしなくてもよくなります。
最後に編集したユーザー naohiro19 on 2014年7月24日(木) 14:21 [ 編集 1 回目 ]

YuO
記事: 947
登録日時: 14年前

Re: COM/Directオブジェクトの解放

投稿記事 by YuO » 11年前

_com_ptr_t クラスというのがあります。
VC++で#import使ってタイプライブラリを作成した場合,これを利用したインターフェースを_COM_SMARTPTR_TYPEDEFマクロを使って定義してくれます。

アバター
nullptr
記事: 239
登録日時: 13年前

Re: COM/Directオブジェクトの解放

投稿記事 by nullptr » 11年前

CComPtrなんてのもありますし、私はstd::(shared|unique)_ptrとカスタムデリータを使う事も多いですが、パフォーマンス面ではintrusive_ptrが最適ですよね。
しかしboostの導入コストを考えると前者らの方が簡単なような気もします。個人的にカスタムデリータを使うことが多いからかもしれませんが。

それにしてもboost::intrusive_ptrはintrusiveな参照カウンタ方式なのに非intrusiveな設計なのがC++らしいGoodなライブラリだと思います。
もはやポインタ以外にも使えるので。C++で採択されない辺りもそういう理由なんですかね。されるとしたらもっと汎用性のあるライブラリとして用意されるか、既に用意されているか。
なんかあった気がするけど思い出せない。なんだったっけな。

まぁでも実際はやはりstd::(shared|unique)_ptrとカスタムデリータが移植性や柔軟性等様々な面でメリットが多いと思うんですけどね。
最後に編集したユーザー nullptr on 2014年7月24日(木) 16:43 [ 編集 1 回目 ]