:: SysFreeString()行为不正常

时间:2017-12-07 19:43:22

标签: c++ visual-c++

我遇到了:: SysFreeString()的问题。似乎当我用大BSTR调用下面的块时(我的是大约40,000个字符),

            VARIANT attValue;
            attValue.vt = VT_BSTR;
            attValue.bstrVal = attributeValue.AllocSysString();
            // use the bstrVal
            ::SysFreeString(attValue.bstrVal);
            VariantClear(&attValue);

字符串未正确清除并破坏堆。但是,对于较小的(~16,000个字符)BSTR,它可以正常工作并且不会发生损坏。我是否有分配或释放的上限?

为什么:: SysFreeString()表现如此?

1 个答案:

答案 0 :(得分:2)

如果要打电话给SysFreeString(),请不要致电VariantClear(),反之亦然。 VariantClear()为您释放BSTR,这是documented behavior

  

该函数通过将vt字段设置为VT_EMPTY来清除VARIANTARG。 VARIANTARG的当前内容首先发布。 如果vtfield是VT_BSTR,则释放字符串。如果vtfield是VT_DISPATCH,则释放该对象。如果vt字段设置了VT_ARRAY位,则释放该数组。

您尝试第二次使用无效指针释放相同的内存两次,因为在调用attValue.bstrVal后您没有将SysFreeString()重置为NULL。

呼叫SysFreeString()VariantClear(),但不能同时呼叫。在此示例中,调用VariantClear()将是首选解决方案,因为您使用VARIANT来保留BSTR

由于您显然正在使用包装类来分配BSTR,因此我建议您使用类似的包装类来管理VARIANT,例如CComVariant或{{1 }}