私のリークチェッカーは、この機能に2回目のチャンスの例外があると伝えます。クリーンアップの方法_variant_t
今BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, CString strValue)
{
_variant_t vtFld;
if(!strValue.IsEmpty())
vtFld.vt = VT_BSTR;
else
vtFld.vt = VT_NULL;
vtFld.bstrVal = strValue.AllocSysString();
BOOL bret = PutFieldValue(lpFieldName, vtFld);
SysFreeString(vtFld.bstrVal);
return bret;
}
_variant_t
型BSTR部材(bstrVal
)を有しています。我々はknow BSTRは上記のコードで行われているSystemFreeString()
を使用してBSTRを割り当て解除する必要があるが、このBSTRは_variant_t
のメンバであり、この場合は誰が実際にbstrVal
メンバをクリーンアップする必要がある?
inline _variant_t::~_variant_t() throw()
{
::VariantClear(this);
}
すでに例外を発生させSysFreeString()
によってクリーンアップされ、再びメモリをクリーンアップしようとするように私には見えますか? documentationはそのバリアントをクリアすると言いますが、正確に何がクリアされるのかはっきりしません。bstrVal
も解放されますか?
SysFreeString(vtFld.bstrVal);
のコールを削除すると、2回目のチャンス例外が削除されますが、ドキュメントが十分な信頼を与えないため、これが正しいことを知りたいのです。
、決して良いアイデア:あなたは手動で
variant_t
をリセットする必要がある場合は、代わりにそのClear()
メソッドを使用します。 BSTRは、あなたから一度、variant_tによって一度削除されています* 2回*。フィールドにもアクセスしないでください。必要なのは '_variant_t vtFld(strValue);または' vtFld = strValue; '、restはオートマティックです。 –@HansPassant: 'strValue'が空のときには' PutFieldValue() 'に' VT_NULL'を渡す必要があるので、代わりに以下のようなものを使う方が正しいでしょう: '_variant_t vtFld; if(!strValue.IsEmpty())vtFld = strValue;それ以外はvtFld。vt = VT_NULL;戻り値PutFieldValue(lpFieldName、vtFld); ' –