【问题标题】:SysFreeString is not freeing the variableSysFreeString 没有释放变量
【发布时间】:2016-06-15 13:55:55
【问题描述】:

谁能帮我理解为什么下面的代码在分配内存后没有释放内存。

BSTR ys;
{
    ys = ::SysAllocString(L"Asdfghjk");
    {
        ::SysFreeString(ys);
    }
}
wcout << ys; // *I could see "Asdfghjk" in console window*

【问题讨论】:

    标签: c++ winapi visual-c++ com


    【解决方案1】:

    正在释放内存,但它并没有将其清零,所以它恰好仍然包含其先前的值。

    在内存被释放后(在对wcout 的调用中)您对内存的使用是未定义的行为。它似乎可以工作,但是only by accident

    【讨论】:

    • 另外,注意不要将“释放内存”与“破坏其内容”混淆;一个并不意味着另一个。
    • @and 这只是一般性陈述吗?因为我们在这里讨论的是字符串,而字符是不需要销毁的基本类型。
    • 字面意义上的破坏;释放过程不能保证用随机垃圾覆盖字符,甚至不需要将内存返回给操作系统,因此再次尝试访问它会出错。
    • 感谢您的回答。我的意图是“破坏其内容”
    • 如果你想销毁它的内容,@user,在释放它之前调用ZeroMemory。但这真的没有意义,这就是为什么它不会自动完成。
    【解决方案2】:

    在这种释放 BSTR 的特殊情况下,不必释放它,你是对的,这与不将其归零或未定义行为无关。 BSTR 分配被缓存,因此当您执行 SysFreeString() 分配的块不会立即消失,它会保持缓存以供以后使用。这由OANOCACHE 变量和SetOaNoCache 函数控制。

    【讨论】:

      猜你喜欢
      • 2020-12-01
      • 2017-12-26
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 2014-12-17
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多