VC中BSTR和CString的使用
BSTR
在頭文件中的定義如下:
typedef WCHAR OLECHAR;
typedef OLECHAR *BSTR;
所以BSTR的實際類型其實就是WCHAR*。
在MSDN中的Allocating and Releasing Memory for a BSTR一文中,強調了在使用這個類型時,要在內存上小心對待,以避免發生內存泄露。對于從函數中傳出的BSTR,接受的對象要負責對這個BSTR的內存進行管理。在該文中列舉了三種情況:
- 當在一個函數中使用BSTR時,你要負責分配和銷毀它,代碼如下:
| // shows using the Win32 function // to allocate memory for the string: BSTR bstrStatus = ::SysAllocString( L"Some text" ); if (bstrStatus == NULL) ?? return E_OUTOFMEMORY; ? pBrowser->put_StatusText( bstrStatus ); // Free the string: ::SysFreeString( bstrStatus ); //... |
?
- 對于從函數中返回的BSTR,要在程序中進行釋放
| //... BSTR bstrStatus; pBrowser->get_StatusText( &bstrStatus ); ? // shows using the Win32 function // to freee the memory for the string: ::SysFreeString( bstrStatus ); |
?
如果我們自己定義的函數返回一個BSTR,那么這個BSTR的接收函數應該釋放內存。
// Example shows using MFC's
// CString::AllocSysString
?
//...
HRESULT CMyClass::get_StatusText( BSTR * pbstr )
{
?? try
?? {
????? //m_str is a CString in your class
????? *pbstr = m_str.AllocSysString( );
????? }
?? catch (...)
?? {
????? return E_OUTOFMEMORY;
?? }
// The client is now responsible for freeing pbstr.
return( S_OK );
}
//...
?
CComBSTR
這一塊兒得內容原來看過inside ATL時有提過,但是好像有點忘,有點似是而非。所以在自己確定一下。
??? CComBSTR() throw()
??? {
?????? m_str = NULL;
??? }
如上面代碼所示,對于一個CComBSTR對象,剛創建時會默認初始化的。除了這個構造函數外,還有幾個構造函數
CComBSTR( int nSize)? 用來給CComBSTR初始化分配nSize個對象的空間
CComBSTR(int nSize, LPCOLESTR sz) 從sz中拷貝nSize個字符到CComBSTR中,并且在末尾添加一個null,sz可以包含null字符。
CComBSTR(LPCOLESTR pSrc) 用來拷貝一個null結尾的字符串。
CComBSTR(REFGUID guid) 將guid轉為BSTR存儲在CComBSTR中。
CComBSTR中對賦值運算符進行了重定義,代碼如下:
???????? CComBSTR& operator=(__in const CComBSTR& src)
???????? {
???????????????? if (m_str != src.m_str)
???????????????? {
????????????????????????? ::SysFreeString(m_str);
????????????????????????? m_str = src.Copy();
????????????????????????? if (!!src && !*this)
??????????? {
?????????????????????????????????? AtlThrow(E_OUTOFMEMORY);
??????????? }
???????????????? }
???????????????? return *this;
???????? }
從定義的這個函數可以看出,在進行賦值時,CComBSTR自己負責釋放之前的內存。在使用CComBSTR.Attach時,也會進行相應的操作。
通過CComBSTR的Empty函數可以進行內存的釋放。
?
CString
這個類的詳細介紹我從網上找了一篇博客,挺好的。
http://blog.csdn.net/laiyiling/article/details/125216
轉載于:https://www.cnblogs.com/kwliu/archive/2011/07/15/2107805.html
總結
以上是生活随笔為你收集整理的VC中BSTR和CString的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP协议连接的11种状态浅谈
- 下一篇: php文件上传限制