gpt4 book ai didi

c++ - 使用 W2A 将 BSTR 转换为 std::string 时,是否需要清理?

转载 作者:太空狗 更新时间:2023-10-29 20:04:24 31 4
gpt4 key购买 nike

代码如下所示:

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/A2W 宏要非常谨慎。它们是用“alloca”(直接在堆栈上动态分配)实现的。在某些涉及循环/递归/长字符串的情况下,您将得到一个“stackoverflow”(不是开玩笑)。

推荐的方法是使用"new"助手模板。参见 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 转换宏的错误使用”。和上面链接中的“关于临时类实例的警告”。

关于c++ - 使用 W2A 将 BSTR 转换为 std::string 时,是否需要清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20133199/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com