小心使用_bstr_t类

NRF24L01学习操作教程(二)——NRF实现一对一,一对多通讯 以上内容详细介绍了,使用NRF24L01实现1对1单向通讯、1对1双向通讯、1对多双向通讯。 阅读详情

在编写代码的时候用到_bstr_t这个类,调试代码过程中发现结果出人意料。

写了下面三句代码进行测试,发现bstr1、bstr2、bstr3三个变量执行到最后地址指向同一个地方,值都是"ijkl"。   
BSTR bstr1  = _bstr_t(L"abcd");
BSTR bstr2  = _bstr_t(L"efgh");
BSTR bstr3  = _bstr_t(L"ijkl");

再改成下面语句测试,发现bstr1还是等于bstr3,值为"ijkl",但bstr2却正常了,等于"efghabcd",好像和字符串长度有关。
BSTR bstr1  = _bstr_t(L"abcd");
BSTR bstr2  = _bstr_t(L"efghabcd");
BSTR bstr3  = _bstr_t(L"ijkl");

 

_bstr_t(xxx)返回的是_bstr_t的内部指针,可能会随时更改的.........
应该:
BSTR bstr1  = _bstr_t(L"abcd").copy();
BSTR bstr2  = _bstr_t(L"efgh").copy();
BSTR bstr3  = _bstr_t(L"ijkl").copy();

 

对于 BSTR bstr1  = _bstr_t(L"abcd").copy();
这是通过SysAllocStringLen分配新的内存。
用完需要 SysFreeString(bstr1);

 

_bstr_t(L"abcd"); 这只是临时构造了一个_bstr_t对象,该构造函数内会通过SysAllocString来给BSTR分配内存。
在把BSTR的指针返回给 bstr1 之后,就会释放_bstr_t这个临时对象,在其析构函数里就把分配给BSTR的内存释放了。

在执行_bstr_t(L"efgh"); 又临时构造一个,这个时候,没有别的申请过内存,_bstr_t临时对象内给BSTR分配的内存又是上一次给的那块内存。并把内容更改 efgh。
也就是bstr2 指向的内存和 bstr1变量指向的内存地址 是相同的。

_bstr_t(L"ijkl"); 的过程也是一样,最终三者指向的内存地址是一样的。


对于后面那种情况,因为第二个的字符串长度长了,分配的内存刚好在另外一个位置了。
而给第三个bstr分配内存刚好在第一个的原来位置

 

 

2026.1.11:WSL2中Ubuntu发行版的完全卸载干净指南 摘要:本文详细介绍在WSL2中彻底卸载Ubuntu发行版的步骤。首先通过wsl -l -v确认安装的发行版,使用wsl --terminate终止运行后,推荐使用wsl --unregister命令完全删除发行版(包括所有数据)。还可手动检查残留文件位置(如%LOCALAPPDATA%目录),并提供了备份建议(使用wsl --export)。最后说明验证卸载的方法和可选的高级重置操作。整个过程确保彻底清理相关数据并释放磁盘空间。( 阅读详情

相关推荐

Origin2018(汉化版)在使用科学计数法的时候如何将坐标刻度的0.0改成0

文章目录1 问题2 解决方法 1 问题 先看下面这张图,当我使用科学计数法时,纵坐标出现了0.0的字样,这样看起来很不美观。有些期刊还会有要求,不能出现0.0的格式。 图1 那么该怎么将它改成0呢?首先让我们尝试着用Origin自带的属性,看看能不能设置。 2 解决方法 解决方法一: step1: 双击坐标轴,打开坐标轴属性设置。 step2: 在刻度线标签选项中设置左轴的显示 图2 会发现,按照图2的方式改好之后,其它的小数位也全没了,如果但是有些数字就被覆盖了,这显然不是我

qq_40077565的博客 2万+

如何使用BSTR

BSTR是一种字符串指针,如果你在VC找寻其定义,你会发现它其实是unsigned short*,然而它不能像普通的字符串指针char*一样可以直接赋值,而必须使用SysAllocString来分配,用SysFreeString来释放。 另外,又有两个BSTR的包容类_bstr_t和CComBSTR,它们是为了编程者使用BSTR更加方便,因为在他们的构造函数中都调用了SysAllocStri

静水幽深的空间 1162

STM32F407控制舵机

STM32F407控制舵机运行 使用STM32F407控制舵机,首先来看下舵机图片 [黑红白,黑线接GND,红线接VCC,信号线接白色线(有的舵机线的颜色不同,例如褐色红色橘色,仅颜色不同接法还如上述)] 舵机需要信号的周期为20ms,即频率为50Hz。 接下来正式操作: 步骤一:STM32F4程序(本次程序的PWM信号产生的周期频率由定时器TIM14通道1产生(TIM14_CH1),想要使用其它定时器也没关系下面会讲到) #include "pwm.h" void TIM14_CH1_PWM_In

Ievn_Hare的博客 1万+

CString.AllocSysString(),BSTR,_bstr_t的内存泄露

从百度百科里可以知道 CString.AllocSysString()的内存释放是通过SysFreeString()函数来进行,今天在使用一个第三方库的时候有下列语句导致了内存泄露 构造函数 CString name; _bstr_t m_name = name.AllocSysString(); 析构函数 ::SysFreeString(m_name); 究其原因是

wzb198606的专栏 2760

实战篇【2】-H3C防火墙开局基础配置

本篇文章为“H3C防火墙开局基础配置”,主要涵盖配置管理地址、聚合端口、安全区域、安全策略、静态路由、ACL,WEB和SSH远程管理、Console、SNMP、NTP时钟、日志主机等内容,对比交换机配置开局,增加两处配置,安全区域和安全策略。方便调试人员远程管理、调试。

weixin_47402139的博客 1万+

Ad hoc网络路由协议概述4——按需路由协议(2)AODV协议 (Ad-hoc on-demand distance vector algorithm protocol)

AODV协议的基本流程。

weixin_42982240的博客 7705

BSTR 分配和释放内存

bstr 赋值 智能指针 析构函数

qq_33031421的博客 476

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测 目录时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测基本介绍ARIMAXVARVARMAVARMAXSESHWES参考资料 基本介绍 本文介绍ARIMAX、VAR、VARMA和VARMAX基本概念及其Python程序设计。 ARIMAX 具有外源回归量的自回归整合移动平均值(ARIMAX)是 ARIMA 模型的扩展,其还包括外生变量的建模。 外生变量也称为协变量,可以被认为是并行输入序列,其在与

前程算法屋的博客 6688

BSTR用法详解

BSTR详解  BSTR 详解一 - BSTR 简介和内部结构 1          Why need BSTR COM 是一种跨编程语言的平台,需要提供语言无关的数据类型。多数编程语言有自己的字符串表示。 ·                     C++ 字符串是以 0 结束的 ASCII 或 Unicode 字符数组 ·                     Vi

如果爱下去的专栏 8633

注意力机制模块:CVPR 2026 新宠:MLLA(多尺度线性注意力)即插即用,在 YOLO 和 ConvNeXt 上全面涨点

MLLA核心创新点与实践价值摘要(146字) 清华大学LeapLab团队通过解构Mamba模型,发现其核心优势源于遗忘门机制与块设计,而非传统SSM架构。基于此提出的MLLA模块创新性地将这两项设计融入线性注意力框架:1)用位置编码替代循环计算保留遗忘门的位置感知能力;2)通过门控投影+DWConv+MLP重构高效块结构。在COCO检测任务中,MLLA使小目标AP提升11.6%而仅损失6%FPS,支持ONNX/TensorRT全链路部署,代码已开源。该工作为高分辨率视觉任务提供了近乎零代价的性能提升方案。

ZXSXJ的博客 155

NVIDIA Jetson之远程控制软件NoMachine安装使用

参考:https://www.bilibili.com/video/BV1cg4y1i776?t=12 0 背景

ZONGXP的博客 1万+

_bstr_t与BSTR

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34221036的博客 285

STM32cubeMX配置FreeRTOS软件定时器

文章目录前言1.软件定时器概述一.软件定时器特性二、使用cubeMX生成软件定时器总结 前言 本文主要带大家了解什么是软件定时器,并且带大家使用cubeMX配置软件定时器。 1.软件定时器概述 一.软件定时器特性 软件定时器就是一个闹钟当时间到了就执行相对应的任务或者代码。软件定时器是基于系统滴答中断的。在FreeRTOS中我们可以设置无数个软件定时器。 指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期 (period)。 指定类型定时器有两种类型: 1.一次性 这类定时器启动后,它的回调函

m0_49476241的博客 6949

char*,wchar_t*,CString和BSTR之间的转换

前言 本文并不尝试列举出所有的转换方法,只列举作者认为方便易用的方法。 1.char*和wchar_t*的相互转换 可以利用中间类_bstr_t(头文件comdef.h)方便的进行相互转换 const wchar_t* wText = (_bstr_t)"测试"; char* cText = (_bstr_t)L"测试"; 可以通过A2T,A2W,T2...

diaomo9737的博客 421

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

_bstr_t使用陷阱

_bstr_t使用陷阱在使用的时候我们可以定义一个变量_bstr_t strTest; 然后会这样赋值(或者使用宽字符的形式):strTest = ""; strTest = "test";然后我们有另外的字符串类,比如stl中wstring,我们定义一个变量wstring stlStr; 然后通过赋值操作stlStr = strTest将strTest的值赋给stlStr,一切正常。但是有些时

asd467672767的专栏 2798

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

忍不住还是要发篇文章:关于VC6中(VARIANT)BSTR传入传出发生RtlSizeHeap(user breakpoint at address)的问题

As it turns out, I was able to determine why I was getting this RTLSizeHeap problem. Being a novice to COM and ATL, I had a class that stored a string (_bstr_t) value. As you would expect, I had the n

tiewen的专栏 3363

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

wchar_t 宽字符集 研究 和COM的 BSTR VARIANT

  wchar_t 是和 char 平等的地位,即 wchar_t 并非 typedef出来的,是原生的变量。 简单的说,它拥有两个字节,和short 占用空间一样。 比如: 字符串 "我们\n" ANSI 的十六进制为:ce d2 c3 c7 0A 00 6个字节,其中包括字符串最后的\0 Unicode十六进制为:11 62 EC 4E 0A 00 00 00 8个字节,所有的...

weixin_33811961的博客 168

CppCon 2018 学习:These Aren‘t the COM Objects You‘re Looking For

使用RAII方法管理 COM 可以确保 COM 在正确的时机被初始化,并且在作用域结束时自动释放资源。类让你无需手动管理 COM 初始化和清理,简化了代码,也提高了安全性。这个方法可以有效避免线程上下文问题,减少内存泄漏风险,是一种非常好的实践。OLECHAR是WCHAR(宽字符类型)的别名,表示 Unicode 字符。BSTR是一个指向OLECHAR的指针,即一个指向 Unicode 字符的指针。BSTR是 COM 中专门设计的字符串类型,它包含长度前缀、数据字符串和终止符。你需要通过和。

虾球 944

ATL X2X字符串转换宏【谨慎使用】

#include TCHAR *W2T_(WCHAR *lpw) { USES_CONVERSION;//调用ATL的x2x宏的时候别忘这句 return W2T(lpw); } //TCHAR 转 BSTR TCHAR *tstr = "BSTR字符串,释放了没有,不然内存爆死你!"; BSTR *bstr = T2BSTR(tstr); SysFreeString(bstr); /

objectively的专栏 954

C++字符串完全指南(2) - 总结

C++字符串完全指南(2) - 总结 字符串类的打印格式函数 对字符串包装类使用printf()或其它类似功能的函数时要特别小心。包括sprintf()函数及其变种,以及TRACE 和ATLTRACE 宏。它们的参数都不做类型检验,一定要给它们传递C语言字符串,而不是整个string对象。 例如,要向ATLTRACE()传递一个_bstr_t 里的字符串,必须显式用(LPCS

zhanghaifeng1419的专栏 604

ComBSTR的使用

ComBSTR的使用 用 CComBSTR 进行编程 Visual Studio .NET 2003 3(共 3)对本文的评价是有帮助-评价此主题 ATL 类CComBSTR提供对BSTR数据类型的包装。尽管CComBSTR是一个有用的工具,但有一些情况需要特别小心。 转换问题 范围问题 ...

bianchengjingling22的博客 106

转载推荐:COM中不同字符类型相互转换,例如char*, BSTR, CString等等

原文链接如下: http://vip.6to23.com/louis228/techPapers/convertstring.htm 当然,文中类型转换汉书所涉及的头文件并没有一一列举出来,比如_bstr_t所涉及到的<comdef.h>头文件,_com_util::*所涉及到的<comutil.h>及其静态链接库文件comsupp.lib等 //#pragma co...

weixin_30311605的博客 70

浅谈windows的各种字符串(转载)

作者:Froser 链接:https://zhuanlan.zhihu.com/p/56306408 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 说起Windows下的编程,可能大家的印象都是:微软从来都“特立独行”,什么都要来自己的一套,连类型都不例外。C语言下预设的一些基本类型,微软几乎都typedef过,如BYTE,WORD,DWORD等。那么,今天我们来简单聊聊Windows编...

Sum7mer 1154
上一篇: 如何利用Flash控件捕获到swf文件的每一帧数据?
下一篇: 容器类作为全局成员不妥
sheltonwan
博客等级 码龄20年 77粉丝 79原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值