2013-11-21 33 views
3

代碼如下所示:當使用W2A轉換BSTR到的std :: string,有沒有清理需要的?

class A 
{ 
    public: 
    std::string name; 
}; 

A a; 
CComBSTR textValue; 
// some function which fills textValue 
a.name = W2A(textValue); 

現在,我使用的CComBSTR,所以我沒有的dealloc的BString,但W2A分配,我可能要應付任何記憶?即我應該有:

char *tmp = W2A(textValue); 
a.name = tmp; 
// do something to deallocate tmp? 

回答

4

要與W2A/A2W宏非常謹慎。它們用「alloca」(直接在堆棧上動態分配)實現。在涉及循環/遞歸/一長串某些情況下,你會得到一個「計算器」(不開玩笑)。

的推薦方法是使用「新」幫手模板。見ATL and MFC String Conversion Macros

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錯誤地使用轉換宏」。和上述鏈接中的「關於臨時類實例的警告」。

+0

「新」幫手的這提的是美妙的。我一直希望找到不會超出我的籌碼的東西,就是這樣。謝謝你,謝謝你,謝謝你! +1! – MPW

+0

@MPW謝謝。不客氣。不要忘記:一路下來UNICODE的代碼,許多問題將消失... :-) – manuell

4

沒有清理是必需的,因爲W2Aallocates memory on the stack。有一些記憶有關的缺陷,你必須要知道的(棧上分配的直接後果),但沒有看起來在這種特定情況下立即可疑。

相關問題