gpt4 book ai didi

c - c 是否跟踪分配的堆内存?

转载 作者:行者123 更新时间:2023-12-04 01:12:01 25 4
gpt4 key购买 nike

我知道人们一直告诉我要阅读文档,但我还没有掌握要领。我不知道在文档中寻找什么。如果您有关于如何习惯阅读文档的提示,请给我您的提示作为奖励,但现在这是我的问题。在一个简单的程序中说,如果我们分配一些内存块,我可以在完成后释放它,对吗?这是一个这样的程序,它什么都不做,但在堆中分配解除分配内存。

#include <stdio.h>
#include <stdlib.h>


int main(void)
{
char *s = malloc(10);
free(s);
return (0);
}

编译后,如果我们运行valgrind,我们可以看到所有东西都被释放了。现在,这里只是对之前程序的一点改动。

#include <stdio.h>
#include <stdlib.h>


int main(void)
{
char *s = malloc(10);
s++;
free(s);
return (0);
}

在这里,在我释放它之前,我将地址递增 1,一切都乱套了。 Free 现在似乎没有分配这 block 内存(即使它是已分配内存的子集)。如果您想查看它,这是我的错误消息。

*** Error in `./a.out': free(): invalid pointer: 0x0000000001e00011 ***
Aborted (core dumped).

所以这让我开始思考。

  1. c 是否跟踪堆上分配的内存
  2. 如果不是,它怎么知道什么该释放什么不该释放?
  3. 如果它有这样的知识,为什么 c 在退出之前不自动解除分配这样的内存。为什么内存泄漏?

最佳答案

free 的 C 标准描述如下:

  1. The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc, the behavior is undefined.

由于您更改了指针,它与内存管理函数(即 m/re/calloc)返回的指针不匹配,行为是未定义,并且任何事情都可能发生。包括运行时库注意到您已尝试释放无效指针,但运行时也不需要这样做。


至于

  1. Does C keep track of memory's allocated on the heap

它可能……但不一定必须……

  1. If not, how does it know what to free and what to not?

好吧,如果它确实释放了指针指向的内存,那么它显然需要对分配的大小进行某种簿记......但它不需要能够弄清楚是否有任何指针仍然指向那个内存区域。

  1. And if it has such a knowledge, why doesn't c automatically deallocate such memories just before exiting. why memory leaks?

通常在操作系统退出进程后释放内存。那不是问题。真正的问题是程序仍在运行时发生的泄漏。

关于c - c 是否跟踪分配的堆内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64591924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com