2

free 是否会释放下面的内存,如何验证内存是否已释放?

int *p = malloc(sizeof(int));
int *q = p;
free(q);

如何访问动态分配内存的 MCB 结构?

4

3 回答 3

2

是的,它同时p指向qmalloc().

要验证在释放后尝试访问该内存并通过 valgrind 检查它,这将显示无效的内存访问。

于 2013-09-19T05:10:31.257 回答
2

free() 的定义::

void free (void* ptr);

释放内存块

先前通过调用 malloc、calloc 或 realloc 分配的内存块被释放,使其再次可用于进一步分配。

如果 ptr 没有指向使用上述函数分配的内存块,则会导致未定义的行为。

如果 ptr 是空指针,则该函数不执行任何操作。

请注意,此函数不会更改 ptr 本身的值,因此它仍然指向相同(现在无效)的位置。

因此,在这种情况下,如果您尝试通过仍指向同一位置的指针访问已释放的内存,则会导致“未定义的行为”。您可以通过调用此未定义的行为(仅用于实验目的)来验证相同的内容,也可以使用 Valgrind 进行验证。如果您使用的是 Visual Studio,则可以在指针上添加一个监视,q并亲自查看内存布局和块的释放。

于 2013-09-19T05:20:22.667 回答
1

根据您的代码,内存将被释放,但是如果您更改指针 q 而不是初始指针 p。不起作用。

解释:当您调用malloc()时,您传递数量或大小来分配内存,但实际上分配的内存大于大小,因为内存分配器存储了此分配的一些元信息。因此,当您使用给定分配区域的初始指针调用free 时,free() 函数能够获取此信息,因此内存被释放。但是,如果您传递的指针不是分配区域的初始指针,它将不会获得此元信息,并且 free() 将失败。!!!

于 2013-09-19T05:09:55.847 回答