#include <stdio.h>
int main ()
{
int *p = (int *)malloc((100*sizeof(int)));
p++;
free(p);
/* do something */
return 0;
}
问题:
从位置p + 1开始的内存是否空闲(如果malloc返回0x1000,释放的内存将来自0x1004,假设4字节整数)?
除了0x1000的4个字节(如果malloc返回0x1000)不可用(除非你做p--并使用地址)
之外,这个代码是否有任何意义? LI> 醇>答案 0 :(得分:12)
这是未定义的行为 - 您必须将free()
完全相同的指针传递给malloc()
。使用您的代码可能会发生任何事情 - 可能堆已损坏。
这样想。 free()
只有一个参数,因此它必须推断出哪一个标记可以完全脱离该参数。没有办法“释放更少的记忆” - 要么全部释放(要求扣除将是非常耗时的btw),要么发生不好的事情 - 后者更有可能。你不应该假设任何事情,只是不要那样做。
答案 1 :(得分:1)
free()调用将失败,因为p不再是使用malloc()分配的块的地址。
答案 2 :(得分:0)
这段代码不起作用 - 你只能释放由malloc或类似函数分配的指针,你不能释放部分已分配的内存范围。
答案 3 :(得分:0)
嘿,我在gcc上尝试了这个代码,它停止了:
*** glibc detected *** ./a.out: free(): invalid pointer: 0x0829600c ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x7be591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x7bfde8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x7c2ecd]
因此,根据您的第一个答案,您无法释放下一个内存位置。 而对于第二个问题: 除非你做了p--否则这四个字节将无法使用,除非你改变下一个内存位置的内容并且你可以通过执行p -
来使用分配的内存位置,否则这个代码将正常工作答案 4 :(得分:0)
在标准中这种行为是“未定义的”,但实际上,什么都不会被释放。 原因是malloc保留了已分配的块的列表,每个块都由其起始地址标识。 p + 1不在该列表中,因此free将找到一个可以释放的块,并且什么都不做。