C - What does free() do to the memory?
我重新编码了 malloc() free() 和 realloc()。
我有一个带有 malloc().
返回的指针的链表
问题是:free() 究竟做了什么?
目前,我做了一个 memset() 以具有与 free() 相同的行为。
但是在我的列表中设置一个标志为"免费"而不是做一个 memset() 以使其更快更好吗?
- I recoded 你是什么意思?
-
我从未阅读过 free() 的实现,但它的行为显然不是您认为的那样,free() 不会将内存设置为 0 它只是将其释放到操作系统,因此可以访问由其他人,但它不会将字节归零。
-
如果您的 malloc() 实现使用链表,则 free() 应该将释放的内存放在空闲列表中。
-
@MariusSiuram 我正在重新编码并使用 LD_PRELOAD 对其进行测试。 @iharob 好的,但是如果我没有将它设置为 0,例如我们仍然可以打印一个已被释放的指针,这在系统空闲时是不可能的。这就是为什么我认为做一个 memset() 是件好事。顺便说一句,memset 仍然允许我将指针用于下一个 malloc()。那也很好吗? @wildplasser我没有免费列表,但我的列表中只有一个标志来判断它是否免费,认为这是一种更好的方法,我错了吗?
Free : 调用将取消链接/取消分配指针指向的内存,以便其他进程可以使用它。
Memset : 调用将设置一个内存/填充一个内存位置。它不会取消链接/取消分配内存,并且内存保持分配/占用,直到程序存在。这可能会导致内存泄漏。
您可以使用 valgrind 工具来检查内存泄漏。
如果不需要,最好取消链接/取消分配内存。
通常 free(3) 不会对内存本身做任何事情。 (如果担心安全或隐私问题,您应该在释放之前清除内存。)
如果你想实现malloc,你需要有一些空闲内存块的数据库。当内存被释放时,如果有的话,你应该将它与伴随的空闲内存一起加入。如果一个完整的页面最终未被使用,您应该告诉内核您不再需要它(取决于您最初是如何获得该内存的)
-
好的,所以如果我使用 memset 它不像系统调用,但你个人认为这是一个像我一样做的好方法吗?它安全还是我错过了什么?
-
@nookonee free() 通常会将内存返回给内存分配器,因此可以在以后调用 malloc() 时再次使用内存。与 memset() 所做的相比,这是一件非常不同的事情。
-
@nos 好的,目前我有一个包含我所有地址的列表和一个标志,说明它是否免费。所以我正在设置这个标志并执行 memset 所以我可以重复使用它并将它设置为 0,对吗?
-
@Leonard Michlmayr No free 根本不会释放分配给它的内存吗?因为我刚刚尝试 malloc() 处理长度为 15 的 char *,将一个随机句子放入其中,打印该句子,释放 char *,然后打印相同的 char * 变量并得到相同的句子。所以看起来内存并没有被释放,不是吗?
-
@z.karl,正如我所说,免费不会更改内存中的数据。这就像将您的餐桌留在快餐店。如果您决定稍后再回来,您的托盘可能还在,但不能保证。如果要确保清除数据,请在释放前使用 memset。这就是清理你的桌子的方法。如果您不使用 memset(这是您大多数时候使用的方式),下一位客户将移除您的托盘。 (注意,如果你想确保没有数据泄露给其他进程,memset 是不够的。)
-
@LeonardMichlmayr 啊,谢谢!我真的很喜欢快餐类比!
C 库函数 void free(void *ptr) 释放先前通过调用 calloc、malloc 或 realloc 分配的内存。
您应该使用它来防止内存泄漏。
- 这真的是 free() 所做的吗?因为我刚刚尝试 malloc() 处理长度为 15 的 char *,将一个随机句子放入其中,打印该句子,释放 char *,然后打印相同的 char * 变量并得到相同的句子。所以看起来内存并没有被释放,不是吗?
-
@z.karl 您似乎认为"解除分配"意味着它并不意味着什么。它不再保留供您使用;它不再属于你。在你放弃它之后它是否仍然包含你放在那里的一些东西是实现定义和不可预测的,尤其是随着时间的推移。
-
@tripleee 啊,谢谢你指出这个误解。所以 free() 似乎很像 rm linux 命令,它取消了相关内存/文件的链接,它可能是也可能不是它以前的位置,但其中的任何内容都不是由什么决定的以前没有?
-
我不会这么说。通常,当资源被释放时对其进行擦除是没有意义的,但它可能会被保留给其他东西,并随时替换其内容。系统负载和操作系统分配策略会影响这种情况是否可能早晚发生;典型的 Unix 文件系统会很快回收释放的空间,而其他一些文件系统会尝试更长时间地保持原状,例如以减少碎片化。您的说明似乎仍然混淆了位置(地址) - 它永远不会改变 - 与内容。