CComBSTR 内存结构一瞥

2023-10-20 14:50
文章标签 内存 结构 一瞥 ccombstr

本文主要是介绍CComBSTR 内存结构一瞥,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 一直迷惑于以下函数调用:

// 被调用函数
STDMETHODIMP CAppt::GetAttendees(LPBSTR lpbstrXML){}// 调用函数段
CComBSTR bstrXML;
HRESULT hr = (*m_ppSettingsSink)->GetAttendees(&bstrXML);

为什么一个 CComBSTR 变量取地址之后能对应一个 LPBSTR 指针?

查阅了很多资料,最貌似能合理解释的一个说法是从 CComBSTR 内存结构角度阐述(如下图, from atlcomcli.h)

class CComBSTR
{
public:BSTR m_str;CComBSTR() throw(){m_str = NULL;}
...
}

大概意思就是说,因为 CComBSTR 类型可以隐式转换为 BSTR,因为有相应的运算符重载。而 LPBSTR 实际上是 BSTR* 类型,即指向 BSTR 类型的指针。所以在函数被调用时,参数会发生隐式的类型转换。

CComBSTR ccomBstr(L"Hello, COM!");
BSTR bstr = ccomBstr; // 隐式转换调用 operator BSTR 运算符,将 CComBSTR 转换为 BSTR

在上述示例中,将 CComBSTR 对象 ccomBstr 赋值给 BSTR 类型的变量 bstr 时,编译器会自动调用 CComBSTR 类的 operator BSTR 运算符重载,将 ccomBstr 转换为 BSTR 类型的指针。

结合 LPBSTR 和 BSTR 的定义(如下图)

typedef wchar_t* BSTR;
typedef BSTR *LPBSTR;

但仔细揣摩,还是解释不了最初的疑惑。直到调试程序后一眼就看明白了原委。

  

答案解释起来简单至极,就是因为在物理地址上 &ccomBstrXml.m_str 其实等同于 &ccomBstrXml。

不太严谨的一个等式: &ccomBstrXml == &ccomBstrXml.m_str == LPBSTR

这篇关于CComBSTR 内存结构一瞥的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/247816

相关文章

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int