1

以下のシナリオで CComBSTR を使用しています。

void MyDlg::OnTimer()
{

      ......

      CComBSTR statusString1 = ::SysAllocString(_T("Test"));

      ....

}

タイマーは 5 秒間隔ごとに実行されます。

上記の場合、メモリは 5 秒ごとに増加しています。私の理解によると、CComBSTR は範囲外になるとメモリをクリーンアップします。したがって、タイマーが終了するたびに、割り当てられたメモリを解放する必要があります。しかし、そうではありません。

CCOMBSTR の使用時にメモリが解放されるタイミングを理解する必要があります。

4

1 に答える 1

3

CComBSTR の使用は間違っています。CComBSTR は、割り当てられた文字列のコピーを作成しており、所有権を取得していません。次のように CComBSTR を初期化できます。

CComBSTR statusString1( L"Test" );

以前に割り当てられた文字列の所有権を取得したい場合は、次のようにします。

BSTR bstrAlloc = ::SysAllocString(_T("Test"));
... Your Code ...
CComBSTR status;
status.Attach( bstrAlloc );

次に、CComBSTR がスコープ外になると、割り当てられた文字列が破棄されます。

詳細情報: CComBSTR の実装を確認することをお勧めしますatlcomcli.h(通常は C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include フォルダーにあります)。複雑ではありません。

于 2012-08-16T09:35:06.417 に答える