[英]Freeing pointer after pointer arithmetic
我的问题非常简单。 说我们有:
char* ptr = (char*) malloc(sizeof(char)*SIZE);
ptr+= SIZE/2;
free(ptr);
当我们释放指针时会发生什么? 是不确定的操作? 它是否释放所有SIZE缓冲区或仅剩余的SIZE / 2? 在此先感谢您为我消除歧义。
您的程序可能会崩溃:free()操作在C中实际上非常简单,但仅适用于原始分配的地址。
典型的内存分配器就像这个伪代码一样工作:
所以当你调用free(ptr)
,分配器会在你的指针前输入6个字节来检查签名。 如果它没有找到签名,它会崩溃:)
如果free()
的参数与先前通过malloc()
和friends分配的指针不匹配,则行为未定义。 您很可能在您的libc
版本中遇到分段错误或断言失败。
Offtopic:你最好没有在C中投射malloc()
的结果。
. 行为未定义,很可能导致分段错误 - 这是个 。 在最坏的情况下,它会破坏程序的内存并引发各种奇怪的错误和错误的输出。
在大多数实现中,这应该导致某种致命错误。 您只能释放已分配缓冲区的开头。
你在windows上得到的典型错误(使用visual studio编译器)就像“不是有效的堆指针”。 在linux上,如上面phihag所说,它通常会导致分段错误。 在这两种情况下,都是运行时错误,通常会终止程序的执行。
行为未定义。 我想你会得到一个段错误...这就是我在系统中尝试时得到的结果。
free()
要求调用者传递内存分配器函数(如malloc()
返回的地址。 任何其他因素都会导致未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.