【发布时间】:2018-06-01 10:20:30
【问题描述】:
所以我知道在堆栈中分配的变量上调用free() 会导致无效指针错误。
在malloced 指针中,malloc() 在实际指针之前分配 8 个字节以留下有关其大小的信息。所以我想知道我是否在一个结构之前创建了一个long,然后在该结构上调用 free 是否可以释放该结构(当然,这是假设这 8 个字节的分配是唯一的malloc 所做的额外事情)。
我想我的最后一个问题是堆栈变量分配和堆分配之间是否有任何真正的区别(就后端对内核的调用而言)。
【问题讨论】:
-
在实际指针之前分配 8 个字节以留下有关其大小的信息。 - 您正在对其实现进行假设
-
@AndreiTumbar 不太确定您的问题是什么。如果你想欺骗
free认为你传递给它的指针以前是mallocd,-嗯,这很可能,看看你的 libc 如何检查给定的指针。但在最好的情况下,它会破坏 malloc 堆。有什么意义? -
@AndreiTumbar
free不是万能的;您有责任将以前的mallocd 指针传递给它。如果你不这样做,事情就会变糟。至于堆栈,你不需要做任何事情。一旦函数返回,堆栈就会重置为调用该函数之前的状态。 -
@AndreiTumbar 不,真的不是。堆栈只是平面缓冲区,支持堆栈的 CPU 具有指向当前“顶部”的寄存器。编译器为您生成该“顶部”的修改。这就是它如此便宜的原因 - 它始终存在,并且“释放”它始终是每个函数一个操作,无论您实际使用了多少堆栈空间。
-
@AndreiTumbar 我不知道你在说什么。如果编译器决定使用寄存器来存储变量 - 它显然不是“在堆栈上”。但是,是的,如果我们谈论的是“自动存储”——那么编译器会根据目标体系结构和许多其他因素(包括程序员的提示,如
register关键字)来决定将它放在哪里。我认为 C 标准根本没有提到堆栈,它只是非常常见的方法。
标签: c memory-management