任何人都可以帮助我理解为什么下面的代码在分配后没有释放内存。
BSTR ys;
{
ys = ::SysAllocString(L"Asdfghjk");
{
::SysFreeString(ys);
}
}
wcout << ys; // *I could see "Asdfghjk" in console window*
答案 0 :(得分:6)
它正在释放内存,但它没有将其清零,所以碰巧它仍然包含它以前的值。
在释放内存后(在wcout
的调用中)使用内存是未定义的行为。它出现,但only by accident。
答案 1 :(得分:0)
在这种释放BSTR的特殊情况下,没有必要释放它,你是正确的,它不是关于不将它归零或是未定义的行为。 BSTR分配是缓存的,所以当你执行SysFreeString()时,分配的块不会立即消失,它会保持缓存以供以后使用。这由OANOCACHE
变量和SetOaNoCache
函数控制。