您的位置:首页 > 其它

可恶的BSTR和它娘家人们

2010-08-06 23:21 155 查看
COM中为了实现各语言之间的相互协作,定义几套专用的东西:其中就有BSTR和它的娘家人:sysallocstring,sysfreestring等用于专门处理BSTR的。
然而这几天我在程序中莫名的遇到一些问题: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可能已经成为了乱码。

更让人郁闷的是这种问题是间歇性发作了,很难找到问题所在。。。坛里的同志们,你们是否遇到这样的问题呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: