私はCOMについてほとんど知りません、そしてGoogleでCOMを検索してもCOMはまったく見つかりませんでした(おそらく代わりに.comアドレスを検索したためです)。
ビデオキャプチャハードウェアを使用しています。そのSDKを使用すると、フレームがキャプチャされたときにコールバックを登録できます。オブジェクトインターフェイスはそのコールバックにパラメータとして渡され、そのオブジェクトにクエリを実行することで、(キャプチャされたフレームピクセルへの)大きなバッファアドレスやその他の情報を取得できます。
さて、Release()を呼び出すと、実際にはメモリが削除されないように見えますが、参照カウントが減少し、カウントが0に達すると、削除されますよね?では、上記の大きなバッファアドレスについては、「delete」キーワードを使用してバッファを「削除」するのはどうでしょうか。
私たちのプログラム(私が書いたものではなく、プログラムを書いた人が会社を辞めた)は、バッファーへのポインターをあるクラスにコピーしますが、コールバックでRelease()を呼び出すことはないようです。後で、バッファはクラスで「削除」されます。フレームインターフェイスオブジェクトをRelease()すると、バッファも削除されるようです。しかし、それらは同じですか?
COMはどういうわけか参照をカウントしますが、ユーザーのコードがそのメモリを削除した場合はどうなりますか?質問がわかりにくい場合は申し訳ありません。つまり、COMオブジェクトから取得したバッファを削除しても安全ですか。
簡略化されたコード:疑わしい状況
void mycallback(IFrame f)
{
char* buffer;
f->GetBuffer(buffer);
MyClass m(buffer);
...
}
MyClass::DeleteBuffer()
{
delete m_buffer;
}