动态内存分配和内存泄漏

时间:2013-09-19 05:07:36

标签: c

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

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

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

3 个答案:

答案 0 :(得分:2)

是的,因为pq都指向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()将失败。 !!!