gpt4 book ai didi

c - 释放堆栈

转载 作者:太空宇宙 更新时间:2023-11-04 06:53:35 26 4
gpt4 key购买 nike

所以我知道在堆栈中分配的变量上调用 free() 会导致无效指针错误。

malloced 指针中,malloc() 在实际指针之前分配 8 个字节以留下有关其大小的信息。所以我想知道我是否在结构之前制作了一个 long ,然后在该结构上调用 free 是否有可能释放该结构(当然这是假设那些分配8 个字节是 malloc 所做的唯一额外的事情。

我想我的最后一个问题是堆栈变量分配和堆分配之间是否存在任何真正的区别(就后端调用内核而言)。

最佳答案

某些 C 实现可能会在分配空间之前使用数据来帮助它们管理空间。有些没有。有些人这样做是为了分配某些大小而不是其他人。如果他们这样做,它可能是八个字节,或者可能是其他数量。您不应依赖这方面的任何行为。

当你声明一个 long对象和一个 struct block 中的某种类型,编译器可能会也可能不会将它们彼此相邻地放在堆栈上。它可能会把 longstruct 之前反之亦然,或者,因为它优化了您的程序,它可能会保留 long在一个寄存器中并且永远不要将它放在堆栈中,它可能会做其他事情。在一些C实现,一个long是八个字节。在某些情况下,事实并非如此。没有什么好的方法可以确保将两个单独的对象放在相邻的内存中。 (您可以通过将它们放在更大的结构中来使它们不分离。)

即使您能够拼凑出 long其次是 struct , 你怎么知道要将什么值放入 long ? C 实现是否将分配的长度放在那里?或者它是指向另一个 block 的指针?或者 C 实现用于跟踪分配的内存的数据库的其他部分?如果mallocfree正在分配空间之前使用内存,该内存不为空。它需要有一些值(value),而你不知道那是什么。

如果幸运的话,传递 struct 的地址至 free可能不会立即使您的程序崩溃。但是从某种意义上说,你已经释放了堆栈的一部分。当您调用 malloc同样,您返回的指针可能指向该内存,然后您的程序可能会写入该空间。那么当您的程序调用其他例程时会发生什么,导致堆栈增长到该空间?您将重叠使用同一内存。您的某些数据将覆盖其他数据,您的程序将无法运行。

是的,在栈上分配的内存和从堆上分配的内存是有区别的。这在 C 呈现给您的程序的模型之外。但是,在进程具有堆栈和堆的系统中,它们通常位于进程内存中的不同位置。特别是,堆栈内存必须在堆栈增长和收缩时保持可用。你不能在不破坏东西的情况下将它与堆混合。

当你尝试不同的事情时,问一些关于会发生什么的问题是很好的。但是,malloc 的现代实现和 free非常复杂,您几乎必须接受它们作为您无法轻易查看的服务。相反,为了帮助您学习,您可能会考虑以下内容:

  • 你会如何编写自己的 mallocfree ?

  • 使用malloc 编写一些分配大量内存的代码,比如一兆字节,并编写两个名为 MyMalloc 的例程和 MyFreemalloc一样工作和 free ,除非他们使用您分配的内存。当MyMalloc被调用时,它会开辟出一 block 内存。当MyFree被调用时,它将返回 block 以使其再次可用。

  • 编写一些随机调用 MyMalloc 的实验代码各种尺寸和MyFree ,顺序有点随机。

  • 您如何才能完成所有这些工作?你如何将兆字节分成 block ?您如何记住哪些 block 已分配,哪些 block 是空闲的?当有人调用 MyFree , 你怎么知道他们回馈了多少?当用 MyFree 返回相邻 block 时,如何将它们重新组合成更大的 block ?

关于c - 释放堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47879220/

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