我记录了malloc()
free()
和realloc()
。C - free()对内存有什么作用?
我有一个链接列表与malloc()
返回的指针。
问题是:free()
究竟做了什么?
目前,我做了memset()
具有相同的行为free()
。
但是,为了让它更快,只需在我的列表中设置一个标记为'免费'而不是执行memset()
更好?
我记录了malloc()
free()
和realloc()
。C - free()对内存有什么作用?
我有一个链接列表与malloc()
返回的指针。
问题是:free()
究竟做了什么?
目前,我做了memset()
具有相同的行为free()
。
但是,为了让它更快,只需在我的列表中设置一个标记为'免费'而不是执行memset()
更好?
通常免费(3)不会对内存本身做任何事情。 (如果担心安全或隐私问题,则应在释放内存之前清除内存。)
如果要实现malloc,则需要有一些空闲内存块的数据库。当内存被释放时,如果有任何内存,您应该将它与伴随空闲内存一起加入。如果一个完整的页面结束了未使用的,你应该告诉内核,你不需要它了(这取决于你如何在第一时间内存)
好吧,如果我使用'memset',它不像系统调用,但是你personnaly认为这是像我这样做的好方法吗?它是安全的还是我错过了什么? – nookonee 2015-02-11 12:37:23
@ nookonee free()通常会将内存返回给内存分配器,所以内存可以在将来对malloc()的调用中再次使用。与memset()相比,这是一个非常不同的东西。 – nos 2015-02-11 13:05:43
@nos好吧,目前我有一个列表,包括我的所有地址和一个标志,说明它是否免费。所以我设置这个标志并执行'memset'因此,我可以重新使用它,它被设置为0,是吗? – nookonee 2015-02-11 13:35:14
C库函数void free(void *ptr)
取消分配先前通过调用calloc
,malloc
或realloc
分配的内存。
您应该使用它来防止内存泄漏。
免费:通话将断开链接/ unallocate内存由指针指向,以便其他进程可以使用它。
Memset:调用将设置一个内存/填充内存位置。它不会取消链接/取消分配存储器,并且存储器保持分配/占用,直到程序存在。这可能导致内存泄漏。
您可以使用valgrind工具来检查内存泄漏。
如果不需要,取消链接/取消分配内存是一种更好的做法。
'我记得'你什么意思? – MariusSiuram 2015-02-11 12:16:27
我从来没有读过'free()'的实现,但它的行为不是你明显想到的,'free()'不会将内存设置为'0',它只是将它释放到操作系统,所以它可以其他人可以访问,但不会将字节清零。 – 2015-02-11 12:16:28
如果您的malloc()实现使用链接列表,free()应该将释放的内存放在空闲列表中。 – wildplasser 2015-02-11 12:16:42