gpt4 book ai didi

C++ 函数为无法调用 SysFreeString() 的函数返回 BSTR

转载 作者:可可西里 更新时间:2023-11-01 09:44:16 25 4
gpt4 key购买 nike

请耐心等待,我作为 C++ 程序员已经有一段时间了。

我需要知道我是否做错了。它有效,但我怀疑它会导致内存泄漏。我有这个功能:

_bstr_t WCH2BSTR(wchar_t* st)
{
BSTR stres = SysAllocString(st);
return (_bstr_t)stres;
}

假设我要使用这样的结果:

wcout << WCH2BSTR(wCharArr) << " done." << endl;

这会导致内存泄漏,还是 BSTR 会被 Java 中的“垃圾收集器”删除?

如果是内存泄漏,我怎样才能在不失去作为单行程序的能力的情况下防止它发生?有时 WCH2BSTR 的结果存储在 BSTR 变量中并正确处理,但我想使用相同的函数以单行方式将 wchar_t 连接到 BSTR。

谢谢。

最佳答案

你有内存泄漏。但它很微妙:

这一行:

BSTR stres = SysAllocString(st);

如您所愿分配一个 BSTR。

然而,返回语句:

return (_bstr_t)stres;

触发对 _bstr_t(const wchar_t*) 构造函数的调用,而不是后者将通过 SysAllocString 分配另一个 BSTR。因此,您从初始调用中泄露了一个字符串。

这可能更接近您想要的:

_bstr_t WCH2BSTR(const wchar_t* st)
{
return _bstr_t(str);
}

_bstr_t 的构造函数将为您执行 SysAllocString 操作。 _bstr_t 的析构函数将为您执行 SysFreeString 操作。

但是……

小心这样说:

BSTR bstr = WCH2BSTR(L"Foo");

因为那会编译!但是在分配给原始 BSTR 之后,辅助函数返回的 _bstr_t 的析构函数将被调用并释放已经返回的指针。

你真正想做的是完全避免辅助函数并在你的代码中明确说明:

_bstr_t bstr = L"Foo";

当 _bstr_t 超出范围时,它所包含的基础 BSTR 也会超出范围。

关于C++ 函数为无法调用 SysFreeString() 的函数返回 BSTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49167072/

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