我正在研究C库,并且我正在努力对内存管理保持谨慎。我有一个为指针分配内存的函数,我试图覆盖指针已经分配的情况。我想知道在分配它之前是否需要释放指针。
char *x = (char *) malloc(12);
// ...
free(x);
x = (char *) malloc(12);
我不确定free(x)
是否必要。
没有分配指针这样的东西。
char *x = (char *) malloc(12);
宣布指针x
。然后它分配12个字节的内存并使x
指向12个字节的内存。
qazxsw poi释放了12个字节的内存。 qazxsw poi仍然指向现在释放的12个字节的内存。
free(x);
分配另外12个字节的内存,并使x
指向新的12个字节的内存。
如果你删除了x = (char *) malloc(12);
,那么你将分配2个12字节的内存,而不是释放第一批。这是否是一个内存泄漏取决于你的程序应该如何工作 - 如果你还没有使用内存的东西,它只是一个内存泄漏。
是的x
是必要的。如果你删除它,你肯定会泄漏内存下次free(x);
。现在,如果尺寸真的相同,那么我怀疑你是否真的需要第二个free(x)
。如果尺寸不同,你可以使用malloc(12)
并删除malloc
。
它是安全的,也就是说:你没有任何未定义的行为。但是你正在泄漏记忆,如果你没有保存第一个realloc()
给出的地址,因为它应该在某个时候点上free
d。
不做malloc()
并不危险,但是你无法从那个状态恢复,因为你丢失了对那块内存的内存的引用,所以你以后不能返回它(这是free()
所要求的)
如果您无法控制返回给定的内存,并且您的程序执行此类行为,您最终可能会占用进程可用的所有内存,这可能会影响整个系统。