ComBSTR 分配

Posted

技术标签:

【中文标题】ComBSTR 分配【英文标题】:ComBSTR assignment 【发布时间】:2010-12-17 06:03:25 【问题描述】:

我对 COM 字符串分配感到困惑。以下哪个字符串赋值是正确的。为什么?

CComBSTR str;
.
.
Obj->str = L""  //Option1

或者应该是

Obj->str = CComBSTR(L"")  //Option2

是什么原因

【问题讨论】:

【参考方案1】:

就个人而言,我更喜欢选项 1,因为这不需要构造新的 CComBSTR 对象。 (当然,他们的代码是否在幕后这样做是另一回事。)

【讨论】:

【参考方案2】:

如果您使用str = CComBSTR(L""),则使用constructor:

CComBSTR( LPCSTR pSrc );

如果您使用str = L"",则使用assignment operator:

CComBSTR& operator =(LPCSTR pSrc);

它们都会正确初始化 CComBSTR 对象。

【讨论】:

【参考方案3】:

选项 1 是首选,因为它只对字符串进行一次分配,而选项 2 则进行 2 (不承受无缘无故创建新的临时对象)。与 VC++ 中的 bstr_t 类型不同,ATL 不执行引用计数字符串,因此它将复制整个字符串。

【讨论】:

【参考方案4】:

真正的BSTR 是:

从 COM 堆临时分配(通过 SysAllocString() 和家族) 一种数据结构,其中字符串数据前面有其长度,存储在 32 位值中。 作为指向该数据结构的第五个字节的指针传递,字符串数据所在的位置。

查看文档: MSDN: BSTR

大多数接受BSTR 的函数在通过 BSTR 创建简单赋值时不会崩溃。这会导致混淆,因为人们观察似乎正在工作的代码,他们从中推断出BSTR 可以像任何WCHAR * 一样被初始化。这个推论是不正确的。

只有真正的BSTRs 可以传递给 OLE 自动化接口。

通过使用调用SysAllocString()CComBSTR() 构造函数,您的代码将创建一个真正的BSTRCComBSTR() 析构函数将负责通过SysFreeString() 将分配的存储返回给系统。

如果您将CComBSTR() 传递给获取所有权的API,请务必调用.Detach() 方法以确保BSTR 未被释放。 BSTRs引用计数的(与 COM 对象不同),因此尝试多次释放 BSTR 会崩溃。

【讨论】:

以上是关于ComBSTR 分配的主要内容,如果未能解决你的问题,请参考以下文章

60.IP地址分配(静态分配+动态分配+零配置)

Linux 内核 内存管理伙伴分配器 ② ( 伙伴分配器分配内存流程 )

nvme分配单元大小多少合适

我们需要预先分配。但是 MATLAB 没有预分配预分配?

为啥扩展切片分配不如常规切片分配灵活?

408考研操作系统)第三章内存管理-第一节4:连续分配管理方式(单一连续固定分区和动态分区分配)