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

Bri*_*ian 2 c++ windows winapi bstr

请耐心等待,我已经成为一名c ++程序员了一会儿.

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

_bstr_t WCH2BSTR(wchar_t* st)
{
    BSTR stres = SysAllocString(st);
    return (_bstr_t)stres;
}
Run Code Online (Sandbox Code Playgroud)

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

wcout << WCH2BSTR(wCharArr) << " done." << endl;
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

sel*_*bie 7

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

这一行:

BSTR stres = SysAllocString(st);
Run Code Online (Sandbox Code Playgroud)

按预期分配BSTR.

但是,退货声明:

return (_bstr_t)stres;
Run Code Online (Sandbox Code Playgroud)

触发对_bstr_t(const wchar_t*)构造函数的调用,而不是通过SysAllocString分配另一个BSTR.所以你从最初的通话中泄露了一个字符串.

这可能更接近你想要的:

_bstr_t WCH2BSTR(const wchar_t* st)
{
    return _bstr_t(str);
}
Run Code Online (Sandbox Code Playgroud)

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

但...

小心这样说:

BSTR bstr = WCH2BSTR(L"Foo");
Run Code Online (Sandbox Code Playgroud)

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

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

_bstr_t bstr = L"Foo";
Run Code Online (Sandbox Code Playgroud)

当_bstr_t超出范围时,它所拥有的底层BSTR也是如此.

  • 旁注 - 作为写这篇文章的结果,我想我刚刚发现为什么`std :: string`没有明确地允许自己被强制转换为`const char*`,而是强迫调用者使用`.c_str( )`方法.这是因为这样的错误会在代码中爆发. (2认同)