2015-02-11 81 views
1

我记录了malloc()free()realloc()C - free()对内存有什么作用?

我有一个链接列表与malloc()返回的指针。

问题是:free()究竟做了什么?

目前,我做了memset()具有相同的行为free()

但是,为了让它更快,只需在我的列表中设置一个标记为'免费'而不是执行memset()更好?

+1

'我记得'你什么意思? – MariusSiuram 2015-02-11 12:16:27

+1

我从来没有读过'free()'的实现,但它的行为不是你明显想到的,'free()'不会将内存设置为'0',它只是将它释放到操作系统,所以它可以其他人可以访问,但不会将字节清零。 – 2015-02-11 12:16:28

+2

如果您的malloc()实现使用链接列表,free()应该将释放的内存放在空闲列表中。 – wildplasser 2015-02-11 12:16:42

回答

2

通常免费(3)不会对内存本身做任何事情。 (如果担心安全或隐私问题,则应在释放内存之前清除内存。)

如果要实现malloc,则需要有一些空闲内存块的数据库。当内存被释放时,如果有任何内存,您应该将它与伴随空闲内存一起加入。如果一个完整的页面结束了未使用的,你应该告诉内核,你不需要它了(这取决于你如何在第一时间内存)

+0

好吧,如果我使用'memset',它不像系统调用,但是你personnaly认为这是像我这样做的好方法吗?它是安全的还是我错过了什么? – nookonee 2015-02-11 12:37:23

+0

@ nookonee free()通常会将内存返回给内存分配器,所以内存可以在将来对malloc()的调用中再次使用。与memset()相比,这是一个非常不同的东西。 – nos 2015-02-11 13:05:43

+0

@nos好吧,目前我有一个列表,包括我的所有地址和一个标志,说明它是否免费。所以我设置这个标志并执行'memset'因此,我可以重新使用它,它被设置为0,是吗? – nookonee 2015-02-11 13:35:14

2

C库函数void free(void *ptr)取消分配先前通过调用calloc,mallocrealloc分配的内存。

您应该使用它来防止内存泄漏。

2

免费:通话将断开链接/ unallocate内存由指针指向,以便其他进程可以使用它。

Memset:调用将设置一个内存/填充内存位置。它不会取消链接/取消分配存储器,并且存储器保持分配/占用,直到程序存在。这可能导致内存泄漏。

您可以使用valgrind工具来检查内存泄漏。

如果不需要,取消链接/取消分配内存是一种更好的做法。