是否应该明确释放由wcsdup分配的内存?

时间:2012-04-27 09:10:19

标签: c++ c windows posix

wcsdup这样的函数隐式调用malloc来为目标缓冲区分配内存。我想知道内存分配不是很明确,所以显然释放存储似乎是合乎逻辑的吗? 这更像是一种设计困境,其原因和反对如下

应该被释放,因为

  1. 不释放它会导致内存泄漏。
  2. 有充分证据表明,即使从C ++程序调用,wcsdup / _wcsdup也会调用malloc来分配内存。
  3. 不应该被释放,因为

    1. 当程序退出时,wcsdup累积的内存最终会被释放。我们总是在整个程序生命周期中遇到一些内存泄漏(除非我们大量调用wcsdup来获取大缓冲区大小)。
    2. 可能会让人感到困惑,因为免费没有显式的malloc。
    3. 由于它不是标准的一部分但符合posix标准,因此Microsoft实现可能不会使用malloc来分配目标缓冲区。
    4. 该方法应该是什么?

3 个答案:

答案 0 :(得分:12)

来自MSDN

  

总是通过调用返回指针上的自由例程来释放这个内存是好的做法

从您关联的页面:

  

返回的指针可以传递给free()

看起来相当明确:如果你关心内存泄漏,那么你应该使用free释放内存。

说实话,我很担心这种暗示的骑士态度:

  

在整个程序生命周期中,我们总是会遇到一些内存泄漏

泄漏记忆的原因很少。即使您今天编写的代码是一次性的,并且它不是一个长期存在的过程,您是否可以确定某人不会将其复制并粘贴到其他程序中?

答案 1 :(得分:2)

是的,当你完成使用它时你应该总是释放堆分配的内存,并且知道它是安全的。您链接到甚至州的文档:

  

对于通过malloc()分配内存的函数,应用程序   应该在呼叫不再需要时释放这样的内存   自由()。对于wcsdup(),这是返回值。

如果您担心免费可能会造成混淆,请发表评论解释。说实话,这似乎是多余的;当一个指针被显式释放,它被释放它的代码“拥有”时很明显,任何困惑的人都可以轻松查找wcsdup文档。

此外,您的程序中应该永远不会出现内存泄漏。在实践中,一些程序确实存在内存泄漏,但这并不意味着它们可以存在。另请注意,仅仅因为您为程序的整个生命周期分配了一块内存,如果您在整个持续时间内仍在使用它,则它不会泄露内存。

答案 2 :(得分:0)

从您自己的链接:

  

对于像malloc()一样分配内存的函数,当调用free()不再需要时,应用程序应该释放这样的内存。

来自MSDN:

  

_strdup函数调用malloc为strSource的副本分配存储空间,然后将strSource复制到分配的空间。

和strdup从MSVC 2005中弃用,并调用它调用_strdup,因此它使用malloc