在我正在研究的這個程序中存在內存泄漏,就提交而言,它已經存在很長一段時間了。根據這兩個解釋explanation 1和explanation 2每當使用=賦值運算符_bstr_t會導致內存泄漏。使用_bstr_t進行內存泄漏,無法修復
上下文 - 有一個數據庫對象,通常用於執行數據庫的快速sql查詢。每種方法最終使用以下方法
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的數據庫以及如何創建時間的泄露數據。我的問題是我能做些什麼來防止程序炸燬並強制對_bstr_t對象進行垃圾回收?
Microsoft指出我使用它清理內存是我的責任,所以如何在不破壞數據傳遞給我的情況下做到這一點?我嘗試做一個字符串的深層副本,但失敗了...任何建議將不勝感激!
經過進一步調查我的內存泄漏的兩個熱點就是我第一次公佈這一個,希望這有助於
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()函數調用返回的引用計數時我釋放該對象,它返回0.因此,我知道我沒有建立COM對象...
當把一個wstring指向_bstr_t的地址時會出現問題嗎?
'_bstr_t'是本地'BSTR'的智能包裝,負責內存分配和釋放。因此你不應該在'_bstr_t'上調用'SysFreeString',因爲它的析構函數會處理這個問題。 – Aurora
那麼如果內存泄露發生,如果它們在完成時應該記住它們的內存呢?我已經研究了vs2015調試器,並且內存增加源於使用這些_bstr_t對象的所有內容...爲什麼它們不被清理?有沒有辦法強制垃圾收集他們? @Aurora –
我想我的問題歸結爲 - 是否有使用bstr而無需調用新的? @Aurora –