Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CCOMVariant中的内存泄漏_C++_Memory Leaks_Com - Fatal编程技术网

C++ CCOMVariant中的内存泄漏

C++ CCOMVariant中的内存泄漏,c++,memory-leaks,com,C++,Memory Leaks,Com,我们运行应用程序时存在漏洞。我们运行UMDH查找泄漏原因。泄漏指向下面的调用堆栈 + 40448 ( 70832 - 30384) 917 allocs BackTrace42C19860 + 560 ( 917 - 357) BackTrace42C19860 allocations ntdll! ?? ::FNODOBFM::`string'+153EB OLEAUT32!VariantCopy+13D ATERegis

我们运行应用程序时存在漏洞。我们运行UMDH查找泄漏原因。泄漏指向下面的调用堆栈

+   40448 (  70832 -  30384)    917 allocs  BackTrace42C19860
+     560 (    917 -    357)    BackTrace42C19860   allocations

    ntdll! ?? ::FNODOBFM::`string'+153EB
    OLEAUT32!VariantCopy+13D
    ATERegistry!CATERegValue::put_Value+28 (<source_code_location>, <line_number>)
    ATERegistry!CWinRegManager::GetWinRegValues+1C9 (<source_code_location>, <line_number>)
方法如下:

GetWinRegValues()
{
...
向量值;
btValue.resize(_MAX_PATH);(//其中_MAX_PATH=260)
...
res=RegEnumValue(hkey、dwIdx、szName、&cbName、0、&dwType、&btValue[0]、&cbValue);//枚举Windows注册表中当前项的值
...
如果(res==错误\u成功){
c变异值;
开关(DW型)
{
案例登记:德沃德:/是
varValue=*(长*)&btValue[0];
打破
case REG_EXPAND_SZ://是,使用ExpandEnvironmentString展开
varValue=(LPTSTR)&btValue[0];
打破
case REG_SZ://是
varValue=(LPTSTR)&btValue[0];
打破
违约:
继续;
}
...
CComPtr pValue;
hr=CComCreator>::CreateInstance(NULL,IID_iatergValue,(void**)和pValue);
...
如果(成功(hr)){
hr=pValue->put_Value(varValue)//这是UMDH显示为泄漏的行
}
put\u value
的实现如下:

STDMETHODIMP CATERegValue::put_值(变量newVal)
{
m_值=新值;
开关(newVal.vt){
案例VT\u BSTR:
if(wcschr(newVal.bstrVal,OLESTR('%'))
m_Type=REG_EXPAND_SZ;
其他的
m_Type=REG_SZ;
hr=S_OK;
打破
案例VT_I4:
m_Type=REG_DWORD;
hr=S_OK;
打破
违约:
hr=错误(OLESTR(“值必须具有变量类型VT_I4或VT_BSTR”)、IID_IATERegKey、E_FAIL);
打破
}
返回人力资源;
}
其中,
m_值
\u variant\t m_值;//当前参数值的variant值


如何修复此泄漏?

cCamVariant本身没有内存泄漏。如果您滥用它,您当然可以创建泄漏。我发现的唯一可疑点是m_Value=newVal。m_Value是什么?如果
m_Value
也是一个
变体
,那么您需要自己进行内存管理(例如调用
SysFreeString()
如果旧值包含一个
BSTR
)。最好使用
\u variant\u t
,然后为您处理内存管理。m\u值的类型为\u variant\u variant\t(Visual Studio)类似于cOMvariant(ATL)。这里不应该有任何泄漏。一定有其他一些我们看不到的代码导致泄漏。您可以尝试在循环中运行这段代码,看看内存是否增加。@JonathanPotter“如果
m_值
也是一个
变量
,那么您需要自己进行内存管理”-最好使用
tcovarianty()
,如果不是
\u variant
CComVariant
CComVariant本身没有内存泄漏。如果您滥用它,当然会造成泄漏。唯一可疑的地方是m_Value=newVal。m_Value是什么?如果
m_Value
也是
variant
那么您需要自己进行内存管理(例如,如果旧值包含一个
BSTR
,则调用
SysFreeString()
)。最好使用
\u variant\t
,然后为您处理内存管理。m_值的类型为_variant\u variant\t(Visual Studio)类似于CComVariant(ATL)。这里不应该有任何泄漏。一定有其他一些我们看不到的代码导致泄漏。您可以尝试在循环中运行这段代码,看看内存是否增加。@JonathanPotter“如果
m_值
也是一个
变量
,那么您需要自己进行内存管理”-最好使用
tcovarianty()
,如果不是
\u variant\u t
cOMvariant