可恶的BSTR和它娘家人们
2010-08-06 23:21
155 查看
COM中为了实现各语言之间的相互协作,定义几套专用的东西:其中就有BSTR和它的娘家人:sysallocstring,sysfreestring等用于专门处理BSTR的。
然而这几天我在程序中莫名的遇到一些问题:BSTR被无缘无故的释放了。查了很久的原因,最后发现sysallcostring
并没有像MSDN上说的那样工作,发现这样:
上面的代码再跟踪的时候发现一个问题就是,执行完后发现pStr1的地址和pStr2的地址是一样的。MSDN说的是申请一块新的内存存放BSTR。。。
于是我下面的代码就莫名其妙的被释放掉了,代码如下:
在执行到(1)的时候因为是“+=”操作符,pDevObjID会先生成一个_bstr_t的临时变量和wsClauseForLink 相加,在这句执行完后,临时变量就要释放掉了,结果发现把pDevObjID释放掉了(跟踪后发现生成临时变量的时候调用_bstr_t的构造函数时候调用了SysAllocString,结果新生成的临时变量内部的指针和pDevObjID地址一样,所以释放掉了pDevObjID),这样就造成了(2)执行时候,pDevObjID可能已经成为了乱码。
更让人郁闷的是这种问题是间歇性发作了,很难找到问题所在。。。坛里的同志们,你们是否遇到这样的问题呢?
然而这几天我在程序中莫名的遇到一些问题:BSTR被无缘无故的释放了。查了很久的原因,最后发现sysallcostring
并没有像MSDN上说的那样工作,发现这样:
//pStr2是有效的BSTR变量 BSTR pStr1 = SysAllocString(pStr2);
上面的代码再跟踪的时候发现一个问题就是,执行完后发现pStr1的地址和pStr2的地址是一样的。MSDN说的是申请一块新的内存存放BSTR。。。
于是我下面的代码就莫名其妙的被释放掉了,代码如下:
_bstr_t wsClauseForLink(L"MASTEROBJID='"); //pDevObjID是有值的BSTR变量 wsClauseForLink += pDevObjID; //(1) wsClauseForLink += L"' OR SLAVEROBJID='"; wsClauseForLink += pDevObjID; //(2) wsClauseForLink += L"'";
在执行到(1)的时候因为是“+=”操作符,pDevObjID会先生成一个_bstr_t的临时变量和wsClauseForLink 相加,在这句执行完后,临时变量就要释放掉了,结果发现把pDevObjID释放掉了(跟踪后发现生成临时变量的时候调用_bstr_t的构造函数时候调用了SysAllocString,结果新生成的临时变量内部的指针和pDevObjID地址一样,所以释放掉了pDevObjID),这样就造成了(2)执行时候,pDevObjID可能已经成为了乱码。
更让人郁闷的是这种问题是间歇性发作了,很难找到问题所在。。。坛里的同志们,你们是否遇到这样的问题呢?
相关文章推荐
- 可恶的BSTR和它娘家人们---bug解决后发发牢骚
- 且行且珍惜,还在coder的人们
- BSTR、char*和CString转换
- 长期困扰人们的经济难题 为何…
- 字符串转换系列五:BSTR、char*和CString转换
- 【seen看世界】:人们为什么会趋于稳定?
- 如何使用R语言解决可恶的脏数据
- 推荐开的公司(改变社会):理想中的(众筹)新型公司 (不以利润最大化 长久发展 以人们的需求为目的)
- 老男孩教育每日一题-第73天 -基础命令点:可恶的^C
- 工作中人们常提到的数据预处理,说的到底是什么?
- 每日区块链:以太坊“拜占庭”硬分叉即将出现,人们该如何关注?
- 整理关于牛人们对图书管理系统领域建模的精彩讨论,以此希望大家学习下别人是如何思考的
- 100多年前人们心中的2018年:部分预测已成现实
- 可恶的首都机场出租车
- “可恶”的诺顿
- "我一直惊讶于人们的创造力"--转自南方周末
- [转载] 可恶的W32.Scard病毐
- 一个优秀IT专家的成长历程 激励所有颓废的人们
- 谨献给所有洗GC/SC的人们,cube charm教程
- 清除可恶的Search For ... [转载]