分配和释放记忆

时间:2011-03-22 15:15:18

标签: c

我的问题很简单。我们通常通过声明一个指针然后为该指针分配一块内存来分配内存。假设代码中的某个地方我碰巧使用

ptr = ptr + 1

然后我用

free(ptr)

有人能说出会发生什么。整个内存块将被取消分配或其他内容。我可以部分解除内存吗?

4 个答案:

答案 0 :(得分:7)

您必须始终将完全指向free(或malloc的{​​{1}}相同指针。)如果不这样做,则“行为未定义“,这是一个艺术术语,意味着你不能依赖程序以任何可预测的方式行事。但是,在这种情况下,您应该会立即崩溃。 (如果你运气不好,它会破坏内存,导致一段时间后崩溃,或者更糟糕的是输出错误。)

部分解除分配内存的唯一方法是realloc,尺寸较小,但这只适用于最后修剪,并且不能保证修剪掉的块可用于其他一些分配。

答案 1 :(得分:1)

取消分配内存块的一部分是不可能的。你唯一能做的就是重新分配块,给它一个不同的大小。但是,这并不能保证块将位于内存中的相同位置(可能会复制到其他位置)。

答案 2 :(得分:1)

你必须传递给free()指向同一位置malloc()返回的指针。那是因为分配器保留了一个你分配的块的列表(@everyone:如果我错了就随意添加/修改),如果你传递给free的指针没有比较它,这个列表free()抱怨( “坏内存块”可能?)。要部分释放内存,您应该使用realloc(),它会更改该内存块的维度,但速度慢且效率低。只有在确定块的新大小或留出更多空间以备将来使用时,才应使用它。

答案 3 :(得分:1)

malloc(),free()和realloc()不是C语言的一部分。

这些是标准库中定义的函数。处理它的标准库中的代码通常称为“分配器”。所以,实际答案是“这取决于C库”。

在Linux上,glibc会使程序崩溃。 在VC ++上,C运行时会破坏分配器的状态

源代码可用于这些库,因此您实际上可以将断点和步骤放入免费。