谁能帮助我理解为什么下面的代码在分配内存后没有释放内存。
BSTR ys;
{
ys = ::SysAllocString(L"Asdfghjk");
{
::SysFreeString(ys);
}
}
wcout << ys; // *I could see "Asdfghjk" in console window*
它正在释放内存,但它没有将其归零,所以碰巧它仍然包含其以前的值。
释放内存后(在调用 wcout
中)对内存的使用是未定义的行为。它似乎有效,但只是偶然的。
在这种释放 BSTR 的特殊情况下,没有必要释放它,你是对的,这不是关于不将其归零或成为未定义的行为。BSTR 分配是缓存的,因此当您执行 SysFreeString() 分配的块不会立即消失时,它会保持缓存以供以后使用。这是由OANOCACHE
变量和SetOaNoCache
函数控制的。