[英]When using W2A to convert BSTR to std::string, is there any clean up needed?
代碼如下所示:
class A
{
public:
std::string name;
};
A a;
CComBSTR textValue;
// some function which fills textValue
a.name = W2A(textValue);
現在,我已經使用了CComBSTR,所以我不必釋放BString,但是W2A是否會分配我可能需要處理的任何內存? 即我應該:
char *tmp = W2A(textValue);
a.name = tmp;
// do something to deallocate tmp?
不需要清理,因為W2A
在堆棧上分配內存 。 您必須注意某些與內存相關的陷阱(堆棧分配的直接后果),但在此特定方案中沒有任何看起來立即可疑的內容。
對W2A / A2W宏非常謹慎 。 它們使用“alloca”實現(直接在堆棧上進行動態分配)。 在涉及循環/遞歸/長字符串的某些情況下,您將獲得“ stackoverflow ”(不開玩笑)。
推薦的方法是使用“新”幫助程序模板。 請參閱ATL和MFC字符串轉換宏
A a;
CComBSTR textValue;
// some function which fills textValue
CW2A pszValue( textValue );
a.name = pszValue;
轉換使用128字節的常規“堆棧”緩沖區。 如果它很小,則會自動使用堆。 您可以直接使用模板類型來調整權衡
A a;
CComBSTR textValue;
// some function which fills textValue
CW2AEX<32> pszValue( textValue );
a.name = pszValue;
不要擔心:您只是減少了堆棧使用量,但如果32個字節不夠,則將使用堆。 正如我所說,這是一個權衡。 如果您不介意,請使用CW2A
。
在任何一種情況下,沒有清理做:-)
請注意,當pszValue超出范圍時,轉換的任何掛起的char *都可能指向垃圾。 請務必閱讀“示例3轉換宏的錯誤使用”。 以上鏈接中的“關於臨時班級實例的警告”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.