请问以下几种情况正确吗:

1.
CComBSTR cbstr(L"jacky ff");
TCHAR * p=cbstr;
trace(p);//编译和运行通过2.
BSTR bstrText = ::SysAllocString(L"Tesvvvvt"); 
p=bstrText;
trace(p);
SysFreeString(bstrText); // 用完释放BSTR可以直接赋值给char*吗?//编译和运行通过
3.
BSTR bstrText = _bstr_t("This is a test"); 
//编译和运行通过
//但问题是_bstr_t调用了析构函数了。4.
BSTR bstrText = CComBSTR("This is a test"); 
//编译和运行通过
//但问题是CComBSTR调用了析构函数了。

解决方案 »

  1.   

    3跟4,仅仅创建临时对象,并调用强制类型转换操作符,返回一个指针,接着_bstr_t或CComBSTR就析构了。bstrText的有效期是极短的,它的有效性随着这行代码执行完而结束。
      

  2.   

    首先BSTR是带字符长度前缀的WCHAR*(宽字符);
    CComBSTR/_bstr_t 是对BSTR的封装;
    char* ansi字符串指针1)不正确,如果你的程序是UNICODE版不会有问题,否则不能直接等;
    2)BSTR不可以直接赋值给char*,因为两个类型明显不一致;
    3)这是C++类作用域的范畴,跟BSTR没关系;
    4)同3
      

  3.   

    BSTR可以直接赋值给char*吗?
    不可以,BSTR是所指示的字符串是宽字节的,要用WCHAR,当然你强制转换另算
    析构函数只要是在大括号内不调用就没事的