8

ヒープ上の wchar_t* を介して SysAllocString を使用して新しい BSTR を割り当てる場合、ヒープ上の元の wchar_t* を解放する必要がありますか?

これは正しい方法ですか?

wchar_t *hs = new wchar_t[20];
// load some wchar's into hs...
BSTR bs = SysAllocString(hs);
delete[] hs;

ここで delete を呼び出してメモリを解放する必要がありますか? それとも、そのメモリは BSTR によって追加されただけですか?

4

5 に答える 5

12

ドキュメントの SysAllocString() は、次のように動作します。

この関数は、新しい文字列を割り当て、渡された文字列をその中にコピーします。

そうです、SysAllocString を呼び出したら、データが新しく割り当てられた BSTR にコピーされているため、元の文字配列を解放できます。

wchar_t割り当てられた withの文字列を解放する適切な方法new[]は、 を使用することdelete[]です。

wchar_t *hs = new wchar_t[20];
...
delete[] hs;

a を解放する適切な方法BSTRは、SysFreeString()を使用することです。

BSTR bs = SysAllocString(hs);
...
SysFreeString(bs);

BSTR を初めて使用する場合は、 Eric の BSTR セマンティクスの完全なガイド を読む必要があります。

于 2010-04-20T17:17:16.803 に答える
11

その名前が示すように、SysAllocStringそのメモリを割り当てますが、引数のメモリを「採用」しません。BSTRはサイズ接頭辞が付けられ、 nullで終了します。したがって、サイズ接頭辞用のスペースがないため、cスタイルの文字列を「採用」することはできません。

于 2010-04-20T17:07:33.413 に答える
4

ドキュメントSysAllocString()は非常に明確です:

この関数は、新しい文字列を割り当て、渡された文字列をその中にコピーします。

渡された文字列データはコピーされますSysAllocString()- 完了後は使用されません - そのバッファを自由に解放または変更できます。

于 2010-04-20T17:17:45.367 に答える
3

はい、deleteメモリ。

于 2010-04-20T17:09:41.760 に答える
1

に変換するwchar_t*には、マクロOLECHAR*を使用する必要があります。W2OLE

wchar_t *hs = new wchar_t[20];
USES_CONVERSION;
BSTR bs = SysAllocString( W2OLE(hs) );
delete[] hs; // no need in hs anymore since SysAllocString allocates memory
...

SysFreeString( bs );  // delete Sys string
于 2010-04-20T17:22:21.613 に答える