bstr是一種字串指標,如果你在vc找尋其定義,你會發現它其實是unsigned
short*
,然而它不能像普通的字串指標char*一樣可以直接賦值,而必須使用sysallocstring來分配,用sysfreestring來釋放。
另外,又有兩個bstr的包容類_bstr_t和ccombstr,它們是為了程式設計者使用bstr更加方便,因為在他們的建構函式中都呼叫了sysallocstring,析構函式呼叫了sysfreestring,然而使用這兩個類時仍然需要特別注意,否則也會導致不可預知的錯誤。
舉例如下:
1.標準用法:
bstr str = sysallocstring(l」aaa」);
…(可以使用此bstr變數的範圍)
sysfreestring(str);
str = null;
需要注意的是當sysfreestring被呼叫後,最好將此bstr變數賦為null,以防止多次釋放,導致釋放非法記憶體空間。
2._bstr_t型別有乙個函式叫copy,使用時需要當心,因為它其實呼叫了sysallocstringbytelen,所以需要呼叫者去釋放返回的bstr字串。
用法如下:
_bstr_t m_state = l"cc";
bstr str = m_state.copy();
…(可以使用此bstr變數的範圍)
sysfreestring(str);
str = null;
3._bstr_t型別有乙個特殊建構函式,其第二個引數是乙個bool值,表示是否進行sysallocstring,如果是false
,表示直接將此字元指標賦給_bstr_t內部所包容的bstr,這雖然給使用者帶來了更大的靈活性,但卻需要使用時更加注意,用法如下:
bstr str1 = sysallocstring(l」aaa」);
_bstr_t str2(str1, false);
注意,此時不需要呼叫sysfreestring,因為_bstr_t的建構函式雖然沒有呼叫sysallocstring,但其析構函式仍然會呼叫sysfreestring。所以不需要使用者自己去釋放了。
4.函式介面傳遞bstr或bstr*的基本規則
· 如果呼叫乙個使用bstr引數的函式,呼叫者負責在呼叫前分配bstr,在呼叫後釋放。例如:
hresult iwebbrowser2::put_statustext( 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。例如:
hresult iwebbrowser2::get_statustext( bstr far* pbstr );
bstr bstrstatus;
pbrowser->get_statustext( &bstrstatus );
// shows using the win32 function
// to freee the memory for the string:
::sysfreestring( bstrstatus );
· 如果你實現乙個返回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 );
· 時刻牢記bstr是乙個指標,而不是乙個物件。儘量減少使用bstr作為結構體或類的成員變數。如果必須使用,一定要認真考慮如何分配和釋放。
5.下面介紹一種比較複雜的情況,利於對問題的深入理解。例如我們現在用到的icf底層庫就有很多類似下面的函式:
void ctestdlg::getstring(bstr* state)
BSTR詳解三 BSTR使用注意事項
1 how to use bstr 1.1 bstr 分析 bstr 設計對於 c 程式設計師好壞參半。一方面,bstr 可以被用於大多數需要 olechar 陣列作為引數的函式。另一方面,不能用熟悉的 c c 函式進行對 bstr 的分配 釋放和處理,例如 malloc,free,new,dele...
BSTR詳解三 BSTR使用注意事項
1 how to use bstr 1.1 bstr分析 bstr設計對於c 程式設計師好壞參半。一方面,bstr可以被用於大多數需要olechar陣列作為引數的函式。另一方面,不能用熟悉的c c 函式進行對bstr的分配 釋放和處理,例如malloc,free,new,delete,lstrcat...
BSTR詳解三 BSTR使用注意事項
2007 9 7 21 34 12 1 how to use bstr 1.1 bstr 分析 bstr 設計對於 c 程式設計師好壞參半。一方面,bstr 可以被用於大多數需要 olechar 陣列作為引數的函式。另一方面,不能用熟悉的 c c 函式進行對 bstr 的分配 釋放和處理,例如 ma...