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