`
ruilin215
  • 浏览: 1148364 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

BSTR的陷阱

阅读更多

COM编程时经常用到BSTR, 最近使用BSTR时发现一些有意思的事情:

1,把BSTR当成类使居然编译通过!

虽然BSTR是一个指针,然而,用如下语句申明一个BSTR变量编译器也没有提出抗议:

BSTR mystr(L"Surprise!");

这里把BSTR当作类了,但是编译时似乎也没有什么问题。可能因为BSTR是用typedef出来的,所以,编译器可以缺省地把它当作一个内部数据类型来处理。就像你可以写出

int i = 3; int j(i)

这样的东西一样。当然,这样写很可能运行时会出问题,因为L"Surprise"应该是一个WCHAR*,而BSTR除了宽字符部分,还有两个字节的长度值,C++编译器在拷贝时不会把这两个字节考虑进去。

2,使用CComBSTR漏了内存

很多时候,如果函数的出参数是一个BSTR*的时候,我们会在函数外声明一个CComBSTR,然后把这个变量用“&”操作符传递给函数。这种方式会造成内存泄漏。比如

CComBSTR mystr("Leak");

HRESULT hr = OneFunction(&mystr);

其原因是,当用“&”操作mystr时,取得的是CComBSTR包装的BSTR的地址而非CComBSTR类实例的地址。而当在函数内部作 *mystr = L"New string" 的操作时,原来的内存就漏掉了。这就提示我们,使用这种“智能指针”要份外小心,因为它们为了使用方便,往往都重载了“*”或者“&”操作符。一不小心就泄漏内存。

分享到:
评论

相关推荐

    BSTR详解一,二

    ### BSTR详解一-BSTR简介和内部结构 #### 1. 为什么需要BSTR COM是一种跨编程语言的平台,为了实现跨语言的兼容性,它需要提供一系列语言无关的数据类型。不同的编程语言通常有着各自特定的方式来表示字符串,例如...

    BSTR导致内存泄露问题

    通过文档《BSTR字符串导致的内存泄露问题.docx》和相关百科资料(如ADO、OLE、BSTR、_bstr_t的百度百科页面),可以进一步深入学习BSTR的使用细节和最佳实践,提高代码质量。 总的来说,BSTR内存泄露是Windows编程...

    BSTR详细解释用法

    由于各种编程语言对字符串的处理方式不同,如C++使用以0结束的ASCII或Unicode字符数组,Visual Basic使用带有长度前缀的ASCII字符数组,Java同样使用以0结束的Unicode字符数组,因此,BSTR作为通用的字符串类型...

    BSTR详解.pdf

    BSTR是微软为了在不同编程语言之间传递字符串而定义的一种通用字符串数据类型,它支持宽字符,并且设计上考虑到了跨语言的兼容性。 首先,要理解BSTR的必要性,需要了解COM平台的特性。COM(Component Object Model...

    BSTR详解四

    【BSTR详解四 - BSTR包容类】 CComBSTR是ATL库为方便开发者处理BSTR(Basic String)类型而设计的一个封装类。在Microsoft的VC 6中,它是BSTR类型的最全面的包装器。与MFC的CString类类似,CComBSTR为BSTR提供了...

    BSTR字符串

    BSTR 字符串 BSTR 字符串是微软在 COM/OLE 中定义的标准字符串数据类型,用于跨系统及不同开发语言间实现互操作。BSTR 字符串类型是一个指针类型,标准 BSTR 是一个有长度前缀和 null 结束符的 OLECHAR 数组。BSTR ...

    BSTR详解五

    当你需要从BSTR转换为这些类型时,可以使用静态类型转换,但必须确保在释放BSTR之后不再使用转换后的指针。例如: ```cpp BSTR bs = ...; LPCTSTR sz = static_cast(bs); // ... 使用后释放BSTR ::...

    BSTR和CString和char的转换

    ### BSTR和CString和char的转换 #### 一、引言 在开发过程中,不同的字符串类型之间经常需要互相转换以适应不同的应用场景。本篇文章详细介绍了`BSTR`、`CString`与`char`类型的字符串相互转换的方法。这些转换在...

    BSTR、Char和CString类型的转换.txt

    本文将详细解析BSTR、Char和CString三种类型之间的转换方法,这三种类型分别代表了不同的字符串存储格式,即二进制安全字符串(BSTR)、字符数组(Char)以及MFC类库中的字符串类(CString)。掌握这些转换技巧对于...

    BSTR、LPSTR和LPWSTR

    ### BSTR、LPSTR和LPWSTR的详细解析及其相互转换 #### 一、BSTR、LPSTR和LPWSTR概述 **BSTR (Basic String)** BSTR 是一种用于 COM 和 OLE 应用程序中的 Unicode 字符串类型。它本质上是一个指向 `OLECHAR` 数组...

    BSTR.rar_BSTR_CBSTR_visual c

    在本压缩包"**BSTR.rar**"中,包含了一个名为"**BSTR.cpp**"的文件,这可能是一个C++源代码文件,展示了如何在Visual C++环境中使用BSTR和CBSTR(C样式BSTR)进行实际操作。 首先,BSTR是OLE Automation中定义的一...

    bstr-to-cstring.zip_BSTR

    在Windows编程环境中,BSTR(Basic String)和CString是两种常用的字符串表示方式。BSTR是Microsoft COM(Component Object Model)接口中广泛使用的字符串类型,而CString则是ATL(Active Template Library)和MFC...

    _bstr_t和_variant_t

    ### _bstr_t 和 _variant_t 的详细介绍 #### 一、引言 在COM(Component Object Model)开发中,为了确保跨平台与跨语言的数据交换兼容性,常常会使用到特殊的封装类型,如_bstr_t和_variant_t。这两种类型不仅在...

    BSTR详解.doc

    【BSTR详解】 BSTR,全称为“Basic STRing”,是微软在COM(Component Object Model)和OLE(Object Linking and Embedding)中定义的一种标准字符串数据类型,主要用于跨编程语言之间的通信。它解决了不同编程语言...

    BSTR Inside

    ### 为什么需要BSTR COM(Component Object Model)作为一种跨编程语言的平台,其核心目标之一就是提供一种语言无关的数据类型。不同的编程语言通常拥有各自特定的字符串表示方法: - **C++**:字符串通常被定义为...

    BSTR.rar_码流卡_蓝拓扑

    "BSTR.rar_码流卡_蓝拓扑"这个标题暗示了这是一个与蓝拓扑码流卡相关的软件开发资源包,可能是驱动程序、API接口文档、示例代码或开发工具。 这个压缩包可能包含以下内容: 1. **驱动程序**:为了使计算机能够识别...

Global site tag (gtag.js) - Google Analytics