내가 작업하고있는이 프로그램에 메모리 누수가 있으며 커밋이 관련되어있는 한 꽤 오랜 동안 사용 해왔다. _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는 사용 후 메모리를 정리하는 것이므로 데이터를 손상시키지 않고 어떻게 처리 할 수 있습니까? 문자열의 깊은 복사본을 만들려고했으나 실패했습니다 ... 어떤 제안이라도 많이 받아 들여질 것입니다! 내 메모리 누수에 대한 두 개의 핫스팟은 내가 처음 게시 한이 하나 추가 조사 후
그러나 때 ...이
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 객체를 빌드하지 않았 음을 알고 있습니다 ...
_bstr_t의 주소에 wstring을 지정할 때 문제가 발생할 수 있습니까?
'_bstr_t'는 메모리 할당과 할당 해제를 처리하는 네이티브'BSTR'을위한 스마트 래퍼입니다. 따라서 소멸자가 이것을 처리 할 것이기 때문에'_bstr_t'에서'SysFreeString'을 호출하지 않아야합니다. – Aurora
그런 다음 메모리 누출이 발생했을 때 메모리 누수가 발생하면 어떻게됩니까? 내가 vs2015 디버거를 attatched 및 메모리 증가는 이러한 _bstr_t 개체를 사용하는 모든 것에서 유래 ... 왜 그들은 청소되지 않습니다? 거기에 가비지 콜렉션을 강요 할 방법이 없습니까? @ 오로라 –
내 질문에 종기 같아요 - 어쨌든 새로운 호출하지 않고 bstr 사용할 수 있습니까 ??? @Aurora –