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