您的位置:首页 > 其它

com中CComBSTR 的利弊

2014-02-11 19:12 183 查看
在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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: