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

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

应该被释放,因为

  1. 不释放它会导致内存泄漏。
  2. 据了解,wcsdup / _wcsdup调用malloc来分配内存,即使从C ++程序调用它也是如此。

不应该被释放,因为

  1. 当程序退出时,由wcsdup累积的内存最终将被释放。 在整个程序生命周期中,我们总是忍受一些内存泄漏(除非我们大量地调用wcsdup来获得大的缓冲区大小)。
  2. 这可能会让人迷惑,因为free并没有被一个明确的malloc所左右。
  3. 由于它不是标准的一部分,但是posix兼容,Microsoft实现可能不使用malloc来分配目标缓冲区。

应该是什么方法?

来自MSDN :

通过调用返回的指针上的空闲例程来释放这个内存是一个很好的习惯

从您链接的页面:

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

这似乎相当明确:如果你关心内存泄漏,那么你应该释放内存使用free

说实话,我很关心这个暗示的骑士心态:

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

很少有很好的理由泄漏记忆。 即使你今天写的代码是一次性的,也不是一个长期的过程,你能确定有人不会把它复制粘贴到其他程序中吗?

是的,当你使用它时,你应该总是释放堆分配的内存,并知道这样做是安全的。 你链接到甚至状态的文件:

对于像malloc()那样分配内存的函数,应用程序在free()调用不再需要的时候应该释放这样的内存。 对于wcsdup(),这是返回值。

如果您担心自由身体可能会引起混淆,请留下评论解释。 说实话,这似乎是多余的; 当一个指针被明确释放时,它被释放的代码“拥有”是非常显而易见的,而任何一个变得困惑的人都可以轻松地查找wcsdup文档。

此外,你应该永远不会有你的程序内存泄漏。 实际上一些程序确实有内存泄漏,但这并不意味着它们可以存在。 还要注意的是,仅仅因为你的程序在整个生命周期内都有一块内存被分配了,如果你在整个使用期间仍然在使用内存,那么就不会泄漏内存。

从你自己的链接:

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

来自MSDN:

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

而从MSVC 2005开始,不建议使用strdup,并调用它调用_strdup,因此它使用的是malloc