当前位置: 首页 > 知识库问答 >
问题:

wcsdup分配的内存是否应该显式释放?

壤驷凯
2023-03-14

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

应释放,因为

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

不应该被释放,因为

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

应该采取什么方法

共有3个答案

邓令雪
2023-03-14

从您自己的链接:

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

来自MSDN:

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

从MSVC 2005开始,strdup被弃用,调用它会调用_strdup所以它使用malloc

鱼锦
2023-03-14

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

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

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

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

尚楚
2023-03-14

来自MSDN:

通过调用返回指针上的free例程来释放此内存是一种很好的做法

从链接的页面:

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

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

老实说,我很担心这一点所暗示的骑士态度:

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

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

 类似资料:
  • 我基本上有一个但是我不需要这个数组中的所有位置。我可以创建另一个节点结构来动态地只设置适当的位置,但这将更加困难,因为我的特定程序依赖于矩阵的索引。如何有选择地释放矩阵的某些索引。 例如,对于特定节点,我不需要uint64_t[4][3]或uint64_t[7][3],如何释放该节点?

  • 问题内容: 就我的理解而言,finalize()和GC是两个不同的方面。GC使用finalize()方法释放对象内存。我们无法声明何时发生GC(即使我们显式调用System.gc())。但是我们可以在对象上显式调用finalize()。 同样,按照docs,对于任何给定对象,Java虚拟机都不会多次调用finalize方法。 因此,当我们先调用finalize()且GC在以后的时间点发生时,会发生

  • 当垃圾收集器运行并释放内存时,内存会返回操作系统还是作为进程的一部分保留下来。我的强烈印象是,内存实际上从未释放回操作系统,而是作为内存区域/池的一部分保留下来,供同一进程重复使用。 因此,进程的实际内存永远不会减少。提醒我的一篇文章是这样的,Java的运行时是用C/C写的,所以我想同样的事情也适用? 更新< br >我的问题是关于Java的。我提到C/C是因为我假设Java的分配/释放是由JRE

  • 问题内容: 我编写了一个Python程序,该程序作用于大型输入文件,以创建代表三角形的数百万个对象。该算法是: 读取输入文件 处理文件并创建一个三角形列表,以其顶点表示 以OFF格式输出顶点:顶点列表,后跟三角形列表。三角形由顶点列表中的索引表示 在打印出三角形之前必须先打印出完整的顶点列表的OFF要求意味着在将输出写入文件之前,必须将三角形的列表保留在内存中。同时,由于列表的大小,我遇到了内存错

  • 问题内容: 如果您运行的代码调用Java中的本机库,那么当内存分配应在对象的生存期内持续时,释放这些库分配的内存的常用方法是什么?在C ++中,我将使用析构函数,但是Java从来没有真正使用过析构函数,现在更少了。 我最感兴趣的特定情况是JOCL,其中有一个对象,该对象包装了已编译的OpenCL内核及其所有始终相同的参数。表示已编译内核和参数的结构都在库侧分配,JOCL提供了一种方法,您可以调用该