在编写代码的时候用到_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);