掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
CComPtrのRleaseメソッドとDetachメソッドの違いについて (ID:70597)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> スマートポインタから切り離したら、誰が解放するのか?が気になりまして。 プログラマがしなければ誰もしません。 > MSDNをみたらDetachメソッドはポインタの所有権を解放します。 > Releaseメソッドはインターフェイスを解放します。 > この違いもわかりません。 まず、所有者(所有権)とは何かを考えます。 所有者とは、この場合、CComPtr が保持している生ポインタが指すインターフェイスを開放する者のことです。生ポインタに対して IUnknown::Release を呼ぶ者と言い換えてもよいです。 CComPtr はインターフェイス ポインタに対する所有権を持っています。これは、CComPtr がデストラクトされる際に、その生ポインタを開放するということです。 これは Release と同じことです。 Detach は所有権を放棄します。 つまり、デストラクタで生ポインタを開放しなくなります。結果、CComPtr のデストラクト後も生ポインタは有効なままです。 CComPtr のデストラクト後も生ポインタが有効である必要がある場合には Detach を使います。かつ、その場合は別途 IUnknown::Release を呼ぶ必要があります。 もうそのポインタを使用しない場合には Release を呼びます。 > 自分でやってみればいいのに。 やってみてもメモリリークはなかなか確認しづらいと思います。 > ちゃんと動きますか? メモリリークを無視すれば動きます。 CComPtr::operator & は、CComPtr が生ポインタを保持していない場合に、新しいポインタ(の所有権)を獲得するためのものです(Attach と同じです)。 ですから、dosomething は hoge にアクセスする関数ではなく、新しい hoge インスタンスを作る関数と思われます。 そのため、開放後の &h を dosomething に渡すのはまったく正当です。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.