簡體   English   中英

當使用W2A將BSTR轉換為std :: string時,是否需要進行清理?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM