请MSXML methods获取其BSTR参数的内存所有权吗?
例如:load
,getElementsByTagName
或selectSingleNode
我问这个是因为我看到的代码只是简单地调用CString
的{{1}}并将其传递给MSXML方法,而不会随后调用AllocSysString()
。
编辑:
我使用SysFreeString()
:https://stackoverflow.com/a/14471409/109747(我的帖子)
答案 0 :(得分:0)
请注意,有关所有权的规则与特定库无关(假设一个符合规则的合理编写的库!)。
大多数情况下,他们都是常识。
如果您将参数“通过引用”传递给方法:
常识:该方法可以更改参考指向的内容。由于您无法预先知道是否会发生这种情况,因此您无法控制发送到方法的值的生命周期,因此您必须放弃对方法的所有权。如果方法必须替换引用指向的值,则必须是释放它的方法 此外,无论方法是否使参考点处于其他位置或原始值保持不变,该方法都无法控制您将使用该值执行的操作(参见1。),因此它必须放弃它电话会议结束时的所有权 如果方法没有修改引用指向的内容,那么它基本上获取参数值的所有权,并在返回时将相同的所有权放弃到相同的值。
我知道;这可能都闻到了肮脏......你知道你通常不拥有方法返回的底层对象。例如,从语义上可以理解,从给定方法获得的对象是由对同一方法的相同调用返回的相同对象(例如,某些->GetCurrentSession()
方法),那么您如何成为其所有者?但我没有说你拥有这个对象 - 我说你拥有参数值,在这种情况下参数值是一个COM接口指针。在这种情况下,所有权意味着您必须在完成后调用->Release()
,这不会影响到同一底层对象的其他接口指针。
更新以添加一些信息:
对于某些类型而言,事情可能会让人感到困惑,但您只需要剥离图层以了解该做什么:
BSTR
参数是“按值”,BSTR*
是“按引用”。 VariantClear(...)
时,将处理任何基础引用。@afriza:你提到的代码正在泄漏这些字符串。