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