请耐心等待我,我一直是一名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以及单行方式。
感谢。
答案 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也是如此。