2

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

应该被释放,因为

  1. 不释放它会导致内存泄漏。
  2. 有据可查的是,wcsdup/_wcsdup 调用 malloc 来分配内存,即使它是从 C++ 程序调用的。

不应该被释放,因为

  1. wcsdup 积累的内存最终会在程序退出时被释放。在整个程序生命周期中,我们总是会遇到一些内存泄漏(除非我们大量调用 wcsdup 以获得较大的缓冲区大小)。
  2. 这可能会令人困惑,因为 free 之前没有显式的 malloc。
  3. 由于它不是标准的一部分但符合 posix,Microsoft 实现可能不会使用 malloc 来分配目标缓冲区。

应该采取什么方法?

4

3 回答 3

12

来自MSDN

最好总是通过在返回的指针上调用空闲例程来释放此内存

从您链接的页面:

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

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

老实说,我很担心由此暗示的骑士态度:

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

很少有充分的理由泄漏内存。即使您今天编写的代码是一次性的,并且不是一个长期存在的过程,您能否确定不会有人将其复制并粘贴到其他程序中?

于 2012-04-27T09:16:09.690 回答
2

是的,当您使用完堆分配的内存并知道这样做是安全的时,您应该始终释放它。您链接到的文档甚至指出:

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

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

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

于 2012-04-27T09:15:58.237 回答
0

从您自己的链接:

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

来自 MSDN:

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

并且从 MSVC 2005 开始不推荐使用 strdup 并调用它调用 _strdup 所以它使用 malloc

于 2012-04-27T09:17:49.407 回答