当我们对单个目标指针进行多次malloc以分配内存时会发生什么?

3

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

#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;
}

3
没错 - 你已经回答了自己的问题。 - artm
2
避免说“malloc一个指针”会有所帮助。每次调用malloc都会分配新的空间。然后,您可以将该空间的地址存储在指针变量中。 - M.M
1
你不需要“malloc一个指针”! - too honest for this site
2个回答

18

在你的代码中

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

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

您会失去先前由 malloc() 返回的实际指针,并且无法通过 free() 释放它。所以,你说得对,旧的内存已经被浪费了,(注:没有被 free()-d )。

每次调用 malloc()如果成功),都会给您提供一个新的内存区域。 它不会创建内存,但是会返回一个请求的内存大小的指针,可供稍后使用并使用free()释放。

补充一下,任何适度的内存检查工具都会对上述代码进行警告。以下是其中一个广泛使用的工具, valgrind/memcheck


3

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

您正在使用或分配不必要的内存,可以使用单个malloc。

当您多次malloc相同指针时会发生什么?

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

每次都会在堆中创建新的内存吗?

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

指针会指向新内存,旧内存就会浪费吗?

一个内存块仍然会在您的任务或进程下保留,直到您明确释放它,在这种情况下,您无法在将ptr指向另一个块之后执行此操作。只有在任务或进程结束之前才会释放它,但在那之前,内存会泄漏。


1
最后一个答案,"不"……你能解释一下吗?一个无法访问的内存为什么不是浪费呢? - Sourav Ghosh
我正在使用的平台有一个64k的任务堆。因此,如果我一遍又一遍地做同样的事情,当我无法分配更多内存时,显然我只使用了堆中的一个块,但实际上所有内存都已泄漏。因此,当操作系统关闭此任务时,所有内存将被释放。 - Mazhar
1
无法访问的对象就是泄漏。一旦一个对象从程序代码中变得不可访问,它就会泄漏。这并不是在程序终止后发生的。最终的释放不再是 C 语言的一部分,而是环境的“礼貌”(虽然不完全无私)。 - too honest for this site
@SouravGhosh 如果内存无法被任何其他进程使用,那么它确实是浪费的。在这种情况下,该进程将继续浪费堆内存,直到用完其配额并导致进程崩溃。然后操作系统将释放该进程持有的所有内存。但在此之前,所有这些内存都无法被另一个进程使用。因此被称为内存泄漏。 - Vivek Vijayan
@SouravGhosh 我在回复你的评论“free()释放的内存从来不会浪费,至少我知道是这样的”。 - Vivek Vijayan
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接