我的问题很简单。我们通常通过声明一个指针然后为该指针分配一块内存来分配内存。假设代码中的某个地方我碰巧使用
ptr = ptr + 1
然后我用
free(ptr)
有人能说出会发生什么。整个内存块将被取消分配或其他内容。我可以部分解除内存吗?
答案 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运行时会破坏分配器的状态
源代码可用于这些库,因此您实际上可以将断点和步骤放入免费。