可恶的BSTR和它娘家人们

来源:互联网 发布:按键精灵安卓 数据库 编辑:程序博客网 时间:2024/04/29 20:15

     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可能已经成为了乱码。

 

    更让人郁闷的是这种问题是间歇性发作了,很难找到问题所在。。。坛里的同志们,你们是否遇到这样的问题呢?

原创粉丝点击