我遇到了:: 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()表现如此?
答案 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 }}