我正在使用C库,并且正在对内存管理非常谨慎。我有一个为指针分配内存的函数,并且试图覆盖指针已经分配的情况。我想知道是否需要在分配指针之前先释放指针。
char *x = (char *) malloc(12);
// ...
free(x);
x = (char *) malloc(12);
我不确定free(x)
是否必要。
答案 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()
)
如果您不控制返回给定的内存,而程序执行了这种行为,那么您最终可以吞噬进程可用的所有内存,这可能会影响整个系统。