wcsdup等函数隐式调用malloc为目标缓冲区分配内存。我想知道,由于内存分配不是很明确,所以显式释放存储似乎合乎逻辑吗?这更像是一种设计困境,赞成和反对的理由如下
应释放,因为
不应该被释放,因为
应该采取什么方法?
从您自己的链接:
对于像通过malloc()一样分配内存的函数,应用程序应该在调用free()不再需要此类内存时释放此类内存。
来自MSDN:
_strdup函数调用malloc为strSource的副本分配存储空间,然后将strSource复制到分配的空间。
从MSVC 2005开始,strdup被弃用,调用它会调用_strdup所以它使用malloc
是的,当您使用完堆分配的内存并知道这样做是安全的时,应该始终释放它。您链接到偶数的文档说明:
对于像malloc()一样分配内存的函数,当调用free()不再需要这些内存时,应用程序应该释放这些内存。对于wcsdup(),这是返回值。
如果您担心免费可能会令人困惑,请留下评论解释它。不过,老实说,这似乎是多余的;当指针被显式释放时,很明显它被释放它的代码“拥有”,任何感到困惑的人都可以轻松查找wcsdup
留档。
此外,您的程序中真的不应该有内存泄漏。实际上,一些程序确实有内存泄漏,但这并不意味着它们可以存在。还要注意,仅仅因为您为程序的整个生命周期分配了一块内存,如果您在整个生命周期内仍在使用它,它就不是泄露的内存。
来自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
问题内容: 如果您运行的代码调用Java中的本机库,那么当内存分配应在对象的生存期内持续时,释放这些库分配的内存的常用方法是什么?在C ++中,我将使用析构函数,但是Java从来没有真正使用过析构函数,现在更少了。 我最感兴趣的特定情况是JOCL,其中有一个对象,该对象包装了已编译的OpenCL内核及其所有始终相同的参数。表示已编译内核和参数的结构都在库侧分配,JOCL提供了一种方法,您可以调用该
问题内容: 我编写了一个Python程序,该程序作用于大型输入文件,以创建代表三角形的数百万个对象。该算法是: 读取输入文件 处理文件并创建一个三角形列表,以其顶点表示 以OFF格式输出顶点:顶点列表,后跟三角形列表。三角形由顶点列表中的索引表示 在打印出三角形之前必须先打印出完整的顶点列表的OFF要求意味着在将输出写入文件之前,必须将三角形的列表保留在内存中。同时,由于列表的大小,我遇到了内存错