free 是否会释放下面的内存,如何验证内存是否已释放?
int *p = malloc(sizeof(int));
int *q = p;
free(q);
如何访问动态分配内存的 MCB 结构?
free 是否会释放下面的内存,如何验证内存是否已释放?
int *p = malloc(sizeof(int));
int *q = p;
free(q);
如何访问动态分配内存的 MCB 结构?
是的,它同时p
指向q
由malloc()
.
要验证在释放后尝试访问该内存并通过 valgrind 检查它,这将显示无效的内存访问。
free() 的定义::
void free (void* ptr);
释放内存块
先前通过调用 malloc、calloc 或 realloc 分配的内存块被释放,使其再次可用于进一步分配。
如果 ptr 没有指向使用上述函数分配的内存块,则会导致未定义的行为。
如果 ptr 是空指针,则该函数不执行任何操作。
请注意,此函数不会更改 ptr 本身的值,因此它仍然指向相同(现在无效)的位置。
因此,在这种情况下,如果您尝试通过仍指向同一位置的指针访问已释放的内存,则会导致“未定义的行为”。您可以通过调用此未定义的行为(仅用于实验目的)来验证相同的内容,也可以使用 Valgrind 进行验证。如果您使用的是 Visual Studio,则可以在指针上添加一个监视,q
并亲自查看内存布局和块的释放。
根据您的代码,内存将被释放,但是如果您更改指针 q 而不是初始指针 p。不起作用。
解释:当您调用malloc()时,您传递数量或大小来分配内存,但实际上分配的内存大于大小,因为内存分配器存储了此分配的一些元信息。因此,当您使用给定分配区域的初始指针调用free 时,free() 函数能够获取此信息,因此内存被释放。但是,如果您传递的指针不是分配区域的初始指针,它将不会获得此元信息,并且 free() 将失败。!!!