CaptureGraphBuilderを使用してレンダリングされる独自のソースフィルタで構成されるDirectShowグラフがあります。プレビューモードでは、[Source] - > [SmartTee] - (PreviewPin) - > [Decoder] - > [Renderer]のグラフになります。独自のフィルタにはカスタムアロケータがあり、それについてSmartTeeに通知します。今すぐ終了すると、すべてのオブジェクトが解放されます。カスタムソースとSmartTeeリークの間にフィルタを挿入するCOMオブジェクト
これで、独自のソースフィルタとSmartTeeフィルタの間にフィルタを挿入しようとしています。新しく作成したフィルタをソースフィルタに接続すると、ソースフィルタに新しいアロケータが作成されます。新しいフィルタ(出力ピン自体にカスタムアロケータを提案する)をSmartTeeフィルタに接続すると、SmartTeeは、ソースとSmartTeeの間の最初の接続で作成されたアロケータを提案します。しかし、SmartTeeはBreakConnectのためにこのアロケータを削除する必要がありました。アプリケーションを終了すると、残りの1つのソース・アロケータ・オブジェクトが生成されます。これは、最初の接続で作成されたアロケータです。
ソースフィルタと挿入されたフィルタには、出力ピンにアロケータを提案するInitAllocator関数があります。
私はそれを試しました、私はビデオレンダラによって提案されたアロケータをオーバーライドしていない場合は動作するようです(このアロケータのネゴシエーションはカスタムベースクラスで行われます)。残念ながらこれはプレビューモードでのみ機能します。キャプチャとプレビューの場合、リークは削除されません。 –
アロケータ内にリークが発生する可能性があります。 – VuVirt
もちろん、ref countがゼロに達するとアロケータが解放されないためです。 –