1

MSXML 方法是否获取其 BSTR 参数的内存所有权?

例如:loadgetElementsByTagNameselectSingleNode

我问这个是因为我看到代码只是调用CString'sAllocSysString()并将其传递给 MSXML 方法而不SysFreeString()随后调用。

编辑:
快速修复我看到的代码_bstr_t https ://stackoverflow.com/a/14471409/109747 (我的帖子)

4

1 回答 1

0

请注意,关于所有权的规则与特定库无关(假设一个尊重规则的合理编写的库!)。

大多数情况下,它们都是关于常识的。

  1. 如果您从方法接收参数,那么您现在就是它的所有者。
    常识:其方法将值传回的对象无法知道参数值将如何使用以及何时不再需要。它别无选择,只能放弃所有权,而您是新的所有者。
  2. 如果您参数“按值”传递给方法,您仍然是所有者。
    常识:方法不知道参数来自哪里。它无法知道您是否还需要它。因此,它不可能是所有者。你是。
  3. 如果参数“通过引用”传递给方法:

    • 您仍然是引用的所有者(参见 2.)。
    • 您放弃了对传入值的所有权。
    • 您获得了您获得的价值的所有权。

    常识:该方法可以更改参考指向的内容。由于您无法提前知道这是否会发生,因此您无法控制发送给该方法的值的生命周期,因此您必须放弃对该方法的所有权。如果方法必须替换引用指向的值,那么它必须是释放它的方法。
    此外,无论该方法将参考点指向其他位置还是保持原始值不变,该方法都无法控制您将如何处理该值(参见 1.),因此它必须在调用结束时放弃其所有权.
    如果该方法不修改引用指向的内容,那么它基本上会获得参数值的所有权,并在返回时将相同的所有权放弃给相同的值。

我知道; 这可能都闻起来很臭……您知道您通常不拥有方法返回的底层对象。例如,从语义上可以理解,您从给定方法获得的对象与对同一方法(例如某个->GetCurrentSession()方法)的相同调用返回的对象相同,那么您怎么能成为它的所有者呢?但我并没有说你拥有对象——我说你拥有参数值,在这种情况下,参数值是一个 COM 接口指针。在这种情况下,所有权意味着您必须->Release()在完成后调用它,这不会影响指向同一底层对象的其他接口指针。

更新以添加一些信息
某些类型的事情可能会让人感到困惑,但您只需要剥离图层即可知道该怎么做:

  • BSTR 是指向内存的指针。是的,您通过引用传递内存,但在 COM 中您管理的是指针,而不是底层内存;因此“按值”/“按引用”讨论适用于 BSTR(指针)本身。也就是说,aBSTR参数是“按值”,aBSTR*是“按引用”。
  • VARIANT 有时包含值,有时包含引用。但同样,在 COM 中,您不直接管理底层值;您管理 VARIANT。“按价值”适用于 VARIANT,并且在 VARIANT 的所有者调用 时会处理任何基础引用VariantClear(...)

@afriza:您提到的代码正在泄漏这些字符串。

于 2013-01-22T19:19:30.667 回答