使用SysFreeString连续释放一个BSTR的问题

BSTR其实也没什么神秘的,事实上是超简单。

可以把BSTR理解为PSTR,就是char*或wchar_t*,是个字符串指针(忽略到底是Unicode还是ANSI编码什么的概念,COM里的东西都是Unicode编码)。
大家都知道,字符串中要存储数据,首先要申请内存,然后才能将字符串放到内存中。分配内存就是 new/HeapAlloc之类的,用完了必须释放内存,否则就是内存泄露。
BSTR也是如此,用之前先分配,用完了再释放,都有对应的函数。

BSTR的结构和PSTR的结构是差不多的,譬如"123",都是4个字节(再次申明,别说Unicode应该是双字节的,这里只是简化理解而已),前3个字节是数据,最后一个是字符串终止符。唯一的区别就是BSTR需要把字符串有多长的信息也要进行存储,它不是存在字符串终止符后面,而是存在第一个字符的前面。
像SysAllocString(_T("TRACE"))这样的函数要做两件事,伪代码:
int nLen = wcslen(L"TRACE");
PWSTR pStart = new WCHAR[nLen + 2];
PWSTR pCur = ++pStart;
wcscpy(pCur, L"TRACE");
*pStart = (char)nLen;
return pCur;

上面的代码就是指,先分配内存,然后将数据拷贝到该内存里,然后将共有多少字节拷贝到第一个字节中。将第一个字节后,也就是字符串开始的内存地址从SysFreeString中return。这里我有些忘记了,开始究竟是用几个字节来记录数据长度,还有就是数据记录的长度是所有的内存地址,还是指nLen,或者是指nLen+1个字节的字符串终止符。这些细节记不得了,这个也无关紧要的。

BSTR调用有些麻烦,就如MFC可以用CString来包装PSTR一样,BSTR也可以被_bstr_t这个类给包装起来的,我一般都是用这个类的,很少用BSTR。
-------------------------------------------------------------------
那楼主操作char*指针是不是会引起死机呢?如果引起死机,相信楼主知道如何排错的吧。BSTR就是个存储内存地址的变量而已。
楼主把上面的BSTR的代码,改成char*,楼主也找不到答案吗?如果找不到答案,那就是不会多线程同步的问题了,和BSTR无关。

楼主真牛,认为我的回答和你的问题无关。唉,一声叹息。
-------------------------------------------------------------------
既然是无效指针,怎么还能使用呢?SysFreeString函数怎么可能知道传给它的是个无效指针呢?除非像COM或函数内部维护一张指针分配列表,否则为任何函数传递无效指针就是有问题的,函数如何分辨呢?如果让楼主写一个函数,让别人为你的函数传递一个指针,你该如何判断传进来的指针有效性?
无效指针能否使用,说得严厉点,这根本不是问题,或者不应该提这样的问题(话重了点请原谅,因为无效指针是绝对不应该使用的,否则是对程序质量的不负责任)。楼主既然已经知道使用了无效指针,那就修改代码,使指针保持有效性。话还是要说回来,平时在多线程里怎么使用指针的,就怎么使用BSTR。
如果无法保证保持指针有效性,那只能是楼主无法把握多线程编程,还需磨炼,这依然不是BSTR的问题引起的!
就像 new后,必须要delete,但一般没人会尝试去delete同一个指针的,
CreateEvent后,也不会重复去CloseHandle同一个句柄的,
作为编程,我们要尽量按照规则去写代码,违反规则会有什么结果是无法预料的。前一天,还看见有人说,主线程要退出了,而辅助线程还没执行完毕,就直接杀死辅助线程,这样做出来的程序,客户可能会不知道,即使程序出了错,客户也不知道是“野蛮施工”造成的。做软件和其他行业是一样的,外行可能不知道,你可以忽悠,内行人一看你的代码就知道你的水平了。

猜你喜欢

转载自blog.csdn.net/myyllove/article/details/83094464
今日推荐