程序在内存使用方面有什么问题?多次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;
}
答案 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
指向另一个块之后你就无法做到。它只有在任务或进程结束时才会被释放,但在该内存被泄露之前它是免费的。