私が取り組んでいるこのプログラムではメモリリークがあり、コミットに関する限りかなりの時間待っています。これらの2つの説明によれば、_bstr_tで=代入演算子を使用すると、メモリリークが発生するたびにexplanation 1とexplanation 2が発生します。_bstr_tを使用したメモリリーク
コンテキスト - データベースのクイックSQLクエリを実行するためによく使用されるデータベースオブジェクトがあります。すべてのメソッドは、最終的には、この方法は、データに原因で_bstr_tのデータベースを照会するために呼ばれていますし、彼らがどのように作成されるたびにリークします記事によると、以下の方法に
NvStatus DbUtils::ReadFromDatabase(IUnknown * poNvData,
const std::wstring & oConnectString,
const std::wstring & oSQLStatement)
{
//some checks
_bstr_t tbtSQLStr = oSQLStatement.c_str();//memory leak
_bstr_t tbtConnStr = oConnectString.c_str();//memory leak
//pass the _bstr_t to another method and get data from DB
return status;
}
を使用しています。私の質問は、プログラムが爆発するのを防ぎ、_bstr_tオブジェクトにガベージコレクションを強制するために何ができるのでしょうか?
Microsoftは、使用した後でメモリをクリーンアップするのは私の責任だと言いますが、データを壊すことなくどのようにすればいいですか?私は文字列の深いコピーをしようとしたが、それは失敗した...任意の提案は非常に感謝される!
さらに調査した後、私のメモリリークのための2つのホットスポットは、私が最初に投稿1と、この一つであり、これは
static bool GetValueFromVariant(VARIANT & tvInputValue,
std::wstring & roOutputValue)
{
_bstr_t tTemp = tvInputValue.bstrVal;
if(tTemp.length()>0)
{
roOutputValue = (wchar_t*) tTemp;
}
return true;
}
コメントはこれらの_bstr_tが...しかし、ときに自動的に自分自身をクリーンアップする必要があることを示唆しているのに役立ちます願っています私のWindowsサービスのヒープサイズをデバッグすると、ヒープサイズは絶えず増加し、デバッガはこれらの_bstr_tオブジェクトをすべて使用する関数を指し続けます。明らかにこれらの_bstr_tはクリーンアップされていません。
このメモリリークの大部分は、COMオブジェクトの繰り返し作成に由来しますが、オブジェクトを解放するときに、Release()関数呼び出しから返された参照カウントを確認します。したがって、私はCOMオブジェクトのビルドアップを持っていないことを知っています...
_bstr_tのアドレスにwstringを指すときに問題がありますか?
'_bstr_t'は、ネイティブ' BSTR'sのためのスマートなラッパーで、メモリの割り当てと解放を処理します。したがって、デストラクタがこれを処理するので、 '_bstr_t'で' SysFreeString'を呼び出すはずがありません。 – Aurora
その後、メモリリークが発生した場合、メモリリークが発生します。私はvs2015デバッガをアタッチしており、これらの_bstr_tオブジェクトを使用しているすべてのものからメモリが増加しています...なぜそれらはクリーンアップされていませんか?ガベージコレクションを強制する方法はありませんか? @Aurora –
私は私の質問が沸騰すると思う - とにかく新しいを呼び出すことなくbstrを使用するのですか? @Aurora –