我使用malloc()
在堆上分配一些内存。我在指针中添加一个偏移量并将其返回到调用函数return ptr+(sizeof(char)*4))
,其中此返回值存储在ptrReturned
中。
最大的问题是,当free(ptrReturned)
从分配的块的开头偏移sizeof(char)*4
时,整个块将被释放,或者它将从偏移中释放内存直到分配块的结尾?我使用的编译器是MSVC ++ 2008。
如果分配的地址存储在链表中,并且有指向前一项的指针,那么它应该将整个块从前一个指针为NULL的位置释放到下一个指针为NULL的位置,对吧?
我已尝试调试并观察内存,但我无法覆盖已释放的块空间。有没有办法可以在定义的地址上显式尝试和分配堆上的空间,并且可能因尝试分配已分配的内存而获得异常?这样我就能知道,如果有的话,当然没有更简单的答案。
我希望问题很明确,如果我在某些信息上缺失,请在评论中告诉我。感谢。
答案 0 :(得分:8)
您必须将相同的指针值传递给malloc()返回的free(),否则您的程序将具有未定义的行为。你期望它可能释放全部或部分已分配的块是没有根据的。
答案 1 :(得分:2)
我从标准中找到以下引用:
否则,如果参数没有 匹配之前返回的指针 calloc,malloc或realloc 功能,或者如果空间已经存在 通过免费或免费电话解除分配 realloc,行为未定义。