当指针递增时,'free'如何工作

时间:2010-03-11 15:36:34

标签: c pointers

当调用malloc时,大小存储在已分配的块附近,以便free可以知道要释放多少等等(http://c-faq.com/malloc/freesize.html)。

我的问题是,假设我们已经动态分配了内存,稍后在代码中我们增加了指针

 pointer++

然后,如果我打电话给

free(pointer) 

实际上释放了什么内存。

是从“指针”指向的当前地址开始分配的字节数,还是从已分配的基址开始的。

9 个答案:

答案 0 :(得分:27)

您需要free()malloc()收到的指针相同的指针。增量,改变或改变它是未定义的行为,通常是一个分段错误。

将您从图书馆收到的指针想象成一本书。你回家看看吧。之后,您将删除首页和书籍的背面并将其交还给图书管理员。他会接受它还是你现在遇到严重的麻烦? ;-)

答案 1 :(得分:10)

您只能针对之前从free()malloc()calloc()(或realloc())获得的值调用NULL。其他一切都未定义。

例如,实现可能会在malloc()的返回地址之前的4个字节中存储已分配块的大小。然后,free()返回4个字节并找出大小。如果您未将原始指针传递回free(),则无效。

答案 2 :(得分:6)

它会导致未定义的行为。很可能它会立即或稍后崩溃你的程序。

答案 3 :(得分:4)

这是未定义的行为。它很可能会在以后导致问题。

答案 4 :(得分:4)

如果在不保存原始malloced位置的情况下递增指针,则无法在其上调用free。您必须在某处保存原始位置,并在增量时使用临时点。

答案 5 :(得分:3)

对原始指针执行pointer++是非常错误的。释放它的结果可能在不同的实现上有所不同,但你绝对不应该这样做。

答案 6 :(得分:3)

管理免费存储的代码只是假设您不会将错误的指针交给它。它接受你给的任何东西,不检查它的合理性,并以解释右指针的方式解释它。假设指针被正确获取,它将根据它从任何内存位置读取的任何值进行操作。如果你递给它一个迷路指针,它会发现荒谬的价值,因此无意义。

这称为未定义的行为,这是一个卑鄙的事情。它可能会格式化您的硬盘驱动器,为您的CPU加油,或者使您的程序看起来像您预期的那样工作直到您退休。你永远都不会知道。

答案 7 :(得分:2)

这就是我们所说的内存泄漏/分段错误。

你必须将相同的指针值传递给free(),因为你从malloc()得到的那个或你的应用程序将会出错/崩溃。

答案 8 :(得分:-1)

malloc()返回的指针直接指向程序将使用的堆上的内存。

但是,这不是唯一分配的内存。在返回的指针之前的内存位置分配几个字节,指示堆上块的大小。您的程序不会使用它,但肯定会免费使用它。

当调用free(p)时,有关其堆上的块的信息包含在例如p-4到p-1的位置中。这当然取决于实现,但细节不需要与程序员有关。程序员唯一需要知道的是,自由使用那个内存区域来从堆中释放内存块,并且该区域是从原始指针p派生的。

换句话说,如果你在p上调用free,那么只有当malloc一次返回p时才有意义。

如果你传入一个不是用malloc创建的指针,谁知道p-1,p-2等会是什么?它可能会导致灾难性的失败。