在C中分配的指针上进行malloc安全吗?

时间:2019-04-01 02:21:46

标签: c memory-management memory-leaks

我正在使用C库,并且正在对内存管理非常谨慎。我有一个为指针分配内存的函数,并且试图覆盖指针已经分配的情况。我想知道是否需要在分配指针之前先释放指针。

char *x = (char *) malloc(12);
// ...
free(x);
x = (char *) malloc(12);

我不确定free(x)是否必要。

3 个答案:

答案 0 :(得分:5)

没有分配指针。

char *x = (char *) malloc(12);声明了一个指针x。然后,它分配12个字节的内存,并使x指向12个字节的内存。

free(x);释放12个字节的内存。 x仍指向现在已释放的12个字节的内存。

x = (char *) malloc(12);分配另外12个字节的内存,并使x指向新的12个字节的内存。

如果您删除了free(x);,那么您将分配2个12字节的内存,而不释放第一批。那是否是内存泄漏取决于程序的工作方式-如果您还不使用内存来处理某些事情,那仅仅是内存泄漏。

答案 1 :(得分:2)

是的,free(x)是必需的。如果删除该内存,则肯定会在下次malloc(12)时泄漏内存。现在,如果大小确实相同,那么我怀疑您是否真的需要第二个malloc。如果大小不同,则可以使用realloc()并删除free

答案 2 :(得分:0)

这是安全的,也就是说:您不会招致任何未定义的行为。但是,如果您没有保存第一个malloc()所提供的地址,那么您就在泄漏内存,因为以后应该在某个地方free() d。

不执行free()并不危险,但是您无法从该状态恢复,因为您丢失了对该内存块所在的内存的引用,因此您以后不能返回它(它是必需free()

如果您不控制返回给定的内存,而程序执行了这种行为,那么您最终可以吞噬进程可用的所有内存,这可能会影响整个系统。