当调用malloc时,大小存储在已分配的块附近,以便free可以知道要释放多少等等(http://c-faq.com/malloc/freesize.html)。
我的问题是,假设我们已经动态分配了内存,稍后在代码中我们增加了指针
pointer++
然后,如果我打电话给
free(pointer)
实际上释放了什么内存。
是从“指针”指向的当前地址开始分配的字节数,还是从已分配的基址开始的。
答案 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等会是什么?它可能会导致灾难性的失败。