我在学计算机工程,我有一些电子课程。我从我的两位教授(这些课程)那里听说,可以避免使用free()
函数(在malloc()
、calloc()
等之后),因为分配的内存空间可能不会再次用于分配其他内存。也就是说,例如,如果您分配4个字节,然后释放它们,您将有4个字节的空间,可能不会再次分配:您将有一个洞。
我认为这太疯狂了:你不可能有一个在堆上分配内存而不释放内存的非玩具程序。但是我没有知识来解释为什么它如此重要,对于每一个malloc()必须有一个免费的。
那么:在任何情况下,使用malloc()
而不使用free()
是否合适?如果没有,我如何向我的教授解释?
这完全是胡说八道,例如malloc
有许多不同的实现,有些人试图让堆更高效,比如Doug Lea的或这个。
其他答案已经很好地解释了,malloc()和free()的实际实现确实会将(defragment)漏洞合并成更大的空闲块。但即使不是这样,放弃免费也是个坏主意。
问题是,您的程序刚刚分配了(并且想要释放)这4个字节的内存。如果它要长时间运行,很可能只需要再次分配4个字节的内存。因此,即使这4个字节永远不会合并成一个更大的连续空间,它们仍然可以被程序本身重用。
简单:只需阅读几乎任何半严肃的malloc()/free()
实现的源代码。这里,我指的是处理调用工作的实际内存管理器。这可能在运行时库、虚拟机或操作系统中。当然,代码在所有情况下都不一样。
通过将相邻的孔连接到更大的孔中,确保内存不被碎片化是非常常见的。更严格的分配器使用更严格的技术来确保这一点。
因此,假设您进行了三次分配和取消分配,并将块按以下顺序排列在内存中:
+-+-+-+
|A|B|C|
+-+-+-+
个人分配的规模无关紧要。然后释放第一个和最后一个,A和C:
+-+-+-+
| |B| |
+-+-+-+
当您最终释放B时,您(最初,至少在理论上)最终会得到:
+-+-+-+
| | | |
+-+-+-+
它可以被分解成
+-+-+-+
| |
+-+-+-+
即单个较大的空闲块,没有剩余碎片。
参考文献,根据要求:
问题内容: 我的应用程序中有一堆缓冲区(其中25到30个),它们很大(.5mb),可以同时访问simulataneousley。更糟糕的是,它们中的数据通常只读取一次,并且经常更新(例如每秒30次)。某种非最佳缓存使用的完美风暴。 无论如何,我想到,如果我可以将内存块标记为不可缓存,那将是很酷的……从理论上讲,这将为其他所有内容在缓存中留出更多空间。 那么,他们是否有办法获得在Linux中标记为不
free工具用来查看系统可用内存: /opt/app/tdev1- free total used free shared buffers cached Mem: 8175320 6159248 2016072 0 310208 5243680 -/+ buffers/c
由分配的内存可以用重新分配。有类似的函数吗?当您不希望在堆上分配内存,并且需要多次分配可变堆栈内存(例如在库函数中,您需要动态内存,但不希望在堆上分配)时,重新分配堆栈内存可能很有用,因为库的用户可能使用自定义的堆分配策略。它看起来是这样的: 重要的是,这一切都发生在堆栈上。问:有重新分配动态堆栈内存的方法吗?
问题内容: 我正在编写独立于操作系统的无锁队列,到目前为止,它工作得很好,但是内存管理方面的问题很小。我不确定它的gcc问题还是我的。问题:将元素添加到列表时,内存增加,但是从列表中删除元素(free(elementPointer);)时,内存使用率没有变化。 但是,当我使用pthreads时,N个生产者和M个消费者的 内存使用量始终约为10mb(当尝试添加和删除〜10kk元素时),因此看起来自由
问题内容: 我编写了一个简单的程序,在free()之后测试动态分配的内存的内容,如下所示。(我知道释放后我们不应该访问该内存。我编写此代码是为了检查释放后内存中将存在什么) 输出:3 0 我以为它将通过第二个打印语句打印垃圾值或崩溃。但是它总是打印0。 1)这种行为是否取决于编译器? 2)如果我尝试使用free()两次释放内存,则会生成核心转储。在手册页中,提到程序行为异常。但是我一直在获得核心转
我想了解为什么多次动态分配调用的数据比直接在代码中指定的或通过的单个调用分配的数据使用如此多的内存。 例如,我用C编写了以下两个代码: 测试1.c:int x用malloc分配 我在这里没有使用free来保持简单。当程序等待交互时,我查看另一个终端中的顶级功能,它向我显示了以下内容: test2. c: int x不是动态分配的 顶部显示: 我还编写了第三个代码,其结果与test2相同,我在tes