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以及单行方式.
谢谢.
你有内存泄漏.但它很微妙:
这一行:
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也是如此.