gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:10:50 25 4
gpt4 key购买 nike

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

例如:load , getElementsByTagName , 或 selectSingleNode

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

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

最佳答案

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

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

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

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

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

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

已更新以添加一些信息:
对于某些类型,事情可能会变得困惑,但您只需要剥开层就知道该怎么做:

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

@afriza:你提到的代码泄露了那些字符串。

关于c++ - MSXML 方法是否获取其 BSTR 参数的内存所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14456240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com