com中CComBSTR 的利弊

         在com中 ATL 类 CComBSTR 提供对 BSTR 数据类型的包装。

标准BSTR是一个有长度前缀和null结束符的OLECHAR数组BSTR的前4 字节是一个表示字符串长度的前缀。BSTR长度域的值是字符串的字节数,并且不包括0结束符。
CComBSTR 类提供了一大批带 ANSI 或 Unicode 字符串作为参数的成员函数 ( 构造函数、  赋值运算符和比较运算符)。这些函数的 ANSI 版本比 Unicode版本 效率较低,因为临时 Unicode 字符串通常内部创建。为了提高效率,尽可能使用 Unicode 版本。
使用注意事项:
转换问题
虽然一些  CComBSTR  方法自动将 ANSI 字符串参数转换为 Unicode,但这些方法总是返回 Unicode 格式的字符串。若要将输出字符串转换回 ANSI,请使用 ATL 转换类。有关 ATL 转换类的更多信息,请参见 ATL 和 MFC 字符串转换宏。
范围问题
与任何功能完善的类一样, CComBSTR 在超出范围时将释放其资源。如果函数返回指向  CComBSTR 字符串的 指针,这会引起问题,因为指针将引用已经释放的内存。在这种情况下,请使用  Copy 方法,如下所示。显示释放CComBSTR对象
在对象超出范围之前,可以显式释放包含在  CComBSTR  对象中的字符串。如果字符串被释放,则  CComBSTR  对象无效。
在  CComBSTR 类分配缓冲区来执行某些运算时,如  += 运算符或  Append 方法,建议不要在紧密型循环内执行字符串操作。在这种情况下, CStringT 可提供更好的性能。
内存泄露问题
将已初始化的  CComBSTR 的地址作为  [out]  参数传递到函数会导致内存泄漏。
在下面的示例中,在函数 OutString 替换为了保存字符串 "Initialized" 而分配的字符串时,该字符串被泄漏。
CComBSTR bstrLeak(L"Initialized");
HRESULT hr = OutString(&bstrLeak);
若要避免泄漏,请在作为  [out]  参数传递地址之前,对现有的  CComBSTR 对象调用  Empty 方法。
请注意,如果函数的参数是  [in, out],则同样的代码将不会导致泄漏。

          如上是在百度百科中查到的知识,在实际项目中,如果用CComBSTR对象来存储数据,然后交互给BSTR对象,如果CComBSTR存储的数据过大,会出现内存释放的严重问题,所以发现用CString代替CComBSTR能解决CComBSTR的不足。

         CString Str;

         BSTR _bstr = Str.AllocSysString();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值