各个dx有兴趣看看下边的各个代码都有什么错误
帮助新手更好理解它们的用法
更请各个dx补充void Q1()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t(bstr);
...
SysFreeString(bstr);
}
void Q2()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t;
bstr_t=bstr;
...
SysFreeString(bstr);}
void Q3()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t; bstr_t=bstr;
bstr=bstr_t;
...
SysFreeString(bstr);
}void Q4()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t(bstr,false);
...
SysFreeString(bstr);
}
帮助新手更好理解它们的用法
更请各个dx补充void Q1()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t(bstr);
...
SysFreeString(bstr);
}
void Q2()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t;
bstr_t=bstr;
...
SysFreeString(bstr);}
void Q3()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t; bstr_t=bstr;
bstr=bstr_t;
...
SysFreeString(bstr);
}void Q4()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t(bstr,false);
...
SysFreeString(bstr);
}
_bstr_t( _bstr_t& s1 ) Constructs a _bstr_t object as a copy of another. This is a "shallow" copy, which increments the reference count of the encapsulated BSTR object instead of creating a new one.
_bstr_t( char* s2 ) Constructs a _bstr_t object by calling SysAllocString to create a new BSTR object and encapsulate it. This constructor first performs a multibyte to Unicode conversion.
If s2 is too large, you may generate a stack overflow error. In such a situation, convert your char* to a wchar_t with MultiByteToWideChar and then call the wchar_t * constructor. _bstr_t( wchar_t* s3 ) Constructs a _bstr_t object by calling SysAllocString to create a new BSTR object and encapsulates it.
_bstr_t( _variant_t& var ) Constructs a _bstr_t object from a _variant_t object by first retrieving a BSTR object from the encapsulated VARIANT object.
_bstr_t( BSTR bstr | bool fCopy ) Constructs a _bstr_t object from an existing BSTR (as opposed to a wchar_t* string). If fCopy is false, the supplied BSTR is attached to the new object without making a new copy with SysAllocString. This is the method used by the wrapper functions in the type library headers to encapsulate and take ownership of a BSTR, returned by an interface method, in a _bstr_t object.
3不对。
bstr=bstr_t;
...
SysFreeString(bstr);
这里bstr指向的内存是由_bstr_t管理的,
因此不能调用SysFreeString(bstr);
bstr_t已经接管了bstr的内存,就不需要SysFreeString释放了
其实就象用new 分配的内存给一个auto_ptr对象一样.不用例外的delete
串被释放了两次Q2(): 对Q3(): 错
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t; bstr_t=bstr;
bstr=bstr_t; // bstr 永远地丢了
...
SysFreeString(bstr);
Q4(): 错
串被释放了两次
BSTR不该在没释放时就重新赋值
bstr_t = bstr:
SysFreeString(bstr);
bstr = bstr_t;要避免BSTR和_bstr_t混用!
BSTR -》_bstr_t 赋值后就立即释放BSTR
_bstr_t -》 BSTR 使用_bstr_t的copy()
BSTR -》_bstr_t 赋值后就立即释放BSTR
_bstr_t -》 BSTR 使用_bstr_t的copy()
BSTR a=::SysAllocString(L"123");
_bstr_t test(a,FALSE);
就不能释放BSTR_bstr_t( BSTR bstr | bool fCopy ) Constructs a _bstr_t object from an existing BSTR (as opposed to a wchar_t* string). If fCopy is false, the supplied BSTR is attached to the new object without making a new copy with SysAllocString. This is the method used by the wrapper functions in the type library headers to encapsulate and take ownership of a BSTR, returned by an interface method, in a _bstr_t object.
看看以下的写法都会有什么问题吗?_bstr_t m_bstrt; //一个类成员
void X1(/*[out]*/BSTR* bstrRet)
{
*bstrRet=m_bstrt;
}
void X2(/*[out]*/BSTR* bstrRet)
{
*bstrRet=m_bstrt.copy ();
}
void X3(/*[out]*/BSTR* bstrRet)
{
*bstrRet=SysAllocString(m_bstrt);
}
void X4(/*[out]*/BSTR* bstrRet)
{
BSTR bstr;
bstr=m_bstrt;
*bstrRet=bstr;
}×××××××××××××××××××××××CComBSTR m_bstr;//一个类成员
void Y1(/*[out]*/BSTR* bstrRet)
{
*bstrRet=m_bstr;
}void Y2(/*[out]*/BSTR* bstrRet)
{
*bstrRet=m_bstr.Detach ();
}
void Y3(/*[out]*/BSTR* bstrRet)
{
*bstrRet=SysAllocString(m_bstr);
}
void Y4(/*[out]*/BSTR* bstrRet)
{
BSTR bstr;
bstr=m_bstr;
*bstrRet=bstr;
}
{
*bstrRet=m_bstrt; // Wrong
}
*bstrRet= SysAllocString(m_bstrt);void X2(/*[out]*/BSTR* bstrRet)
{
*bstrRet=m_bstrt.copy (); //OK
}void X3(/*[out]*/BSTR* bstrRet)
{
*bstrRet=SysAllocString(m_bstrt); //OK
}void X4(/*[out]*/BSTR* bstrRet)
{
BSTR bstr;
bstr=m_bstrt; // Wrong
*bstrRet=bstr;
}
bstr=SysAllocString(m_bstrt);void Y1(/*[out]*/BSTR* bstrRet)
{
*bstrRet=m_bstr; // Wrong
}
*bstrRet=SysAllocString(m_bstr);void Y2(/*[out]*/BSTR* bstrRet)
{
*bstrRet=m_bstr.Detach (); //OK
}
void Y3(/*[out]*/BSTR* bstrRet)
{
*bstrRet=SysAllocString(m_bstr); //OK
}
void Y4(/*[out]*/BSTR* bstrRet)
{
BSTR bstr;
bstr=m_bstr; //Wrong
*bstrRet=bstr;
}
bstr=SysAllocString(m_bstr);
下面的写法有哪些问题? BSTR Addr1, Addr2;
Addr1 = OLESTR("Test");
Addr2 = OLESTR("Memm"); Addr2 = SysAllocString(Addr1);
_bstr_t tt(k);
tt.Destroy();
tt=k;
在赋值中_bstr_t 实际上是重新分配了一个对象
所以在次使用必须释放