MSXML方法是否占用了其BSTR参数的内存所有权?

时间:2013-01-22 10:20:31

标签: c++ memory-management com msxml bstr

MSXML methods获取其BSTR参数的内存所有权吗?

例如:loadgetElementsByTagNameselectSingleNode

我问这个是因为我看到的代码只是简单地调用CString的{​​{1}}并将其传递给MSXML方法,而不会随后调用AllocSysString()

编辑:
我使用SysFreeString()https://stackoverflow.com/a/14471409/109747(我的帖子)

快速修复了我看到的代码

1 个答案:

答案 0 :(得分:0)

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

大多数情况下,他们都是常识。

  1. 如果您从方法接收参数,则您现在是其所有者 常识:方法传递值的对象无法知道参数值的使用方式以及何时不再需要它。它别无选择,只能放弃所有权,而且你是新主人。
  2. 如果将“按值”传递参数传递给某个方法,您仍然是所有者。
    常识:该方法不知道参数的来源。它无法知道您是否仍然需要它。因此,它不能是所有者。你是。
  3. 如果您将参数“通过引用”传递给方法:

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

    常识:该方法可以更改参考指向的内容。由于您无法预先知道是否会发生这种情况,因此您无法控制发送到方法的值的生命周期,因此您必须放弃对方法的所有权。如果方法必须替换引用指向的值,则必须是释放它的方法 此外,无论方法是否使参考点处于其他位置或原始值保持不变,该方法都无法控制您将使用该值执行的操作(参见1。),因此它必须放弃它电话会议结束时的所有权 如果方法没有修改引用指向的内容,那么它基本上获取参数值的所有权,并在返回时将相同的所有权放弃到相同的值。

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

    更新以添加一些信息
    对于某些类型而言,事情可能会让人感到困惑,但您只需要剥离图层以了解该做什么:

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

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