当我们执行多个malloc来为单个目标指针分配内存时会发生什么?

时间:2016-06-15 12:12:12

标签: c memory malloc free dynamic-memory-allocation

程序在内存使用方面有什么问题?多次malloc同一指针时会发生什么?它是否每次都在堆中创建新内存,指针将指向新内存,旧内存将被浪费?

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int *ptr;
    ptr = malloc(sizeof(int));
    *ptr = 111;
    ptr = malloc(sizeof(int));
    *ptr =-234;
    printf(“\n%d\n”, *ptr);
    free(ptr);
    return EXIT_SUCCESS;
}

2 个答案:

答案 0 :(得分:18)

在您的代码中

ptr = malloc(sizeof(int));
*ptr = 111;
ptr = malloc(sizeof(int));

对第二个malloc()的调用将返回值存储到相同的变量中。这样,您就会覆盖先前返回的指针。因此,第二个malloc()(将返回的指针存储在同一个变量中)会导致memory leak

您丢失了malloc()之前返回的实际指针,并且无法free()。所以,你是对的,旧的内存是浪费的,(注意:不是free() - d )。

FWIW,每次调用malloc()提供成功)都会为您提供内存区域。它不会创建内存,但它会返回一个指针,其中包含可以使用的请求内存大小,以及free() - d之后。

要添加到这个,一个(ny)适度的内存检查器工具将尖叫为上述代码。这是广泛使用的一个valgrind/memcheck

答案 1 :(得分:3)

  

程序在内存使用方面有什么问题?

您正在使用malloc使用或分配非连接内存。你可以使用单个malloc。

  

当你将多个时间同步指向同一个指针时会发生什么?

每次将malloc分配的某个内存块的指针存储在同一指针ptr中时,ptr将指向最近的指针。

  

每次都在堆中创建新的记忆

是每次调用malloc时,都会分配一个新的内存块。

  

指针将指向新内存和旧内存   然后被浪费了?

在你明确释放它之前,你的任务或进程仍会保留一块内存,在这种情况下你将ptr指向另一个块之后你就无法做到。它只有在任务或进程结束时才会被释放,但在该内存被泄露之前它是免费的。