C ++函数为无法调用SysFreeString()

时间:2018-03-08 06:52:07

标签: c++ windows winapi bstr

请耐心等待我,我一直是一名c ++程序员。

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

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

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:7)

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

这一行:

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也是如此。