free失败多是内存越界造成的


#include 
#include 
int main(int argc, _TCHAR* argv[])
{
	char *p =(char *)malloc(10);
	p++;
	free(p);
	return 0;
}

指针申请后被修改再free会失败

这个free错误则不好查找,因为实际的程序往往没下面的例子这么简单,可能从申请到最后释放跨域多个模块、大量的处理代码逻辑,指针初始值被修改掉,也就是说分配的这段内存的“门牌号”被改掉了,那么free就会失败。



当我们释放动态分配的内存时,通常会遭遇内存释放失败的错误,我遇到这么一个问题,当我无意间越界访问了动态分配内存时,在释放内存时,就会出现Access violation writing的错误,但我不太确定是不是由于这个原因引起的错误,希望高手解释一下,引起free失败的常见原因

使用free(ptr)释放ptr指向的内存时并不需要提供要释放内存的大小,这是因为在ptr附近的某个位置存放有维护该内存区域的数据,这是由内存申请函数 malloc 等产生的。实际上在ptr之前有个结构体,指示了该块内存的信息。如果你的程序因为内存越界内修改了这个结构体,则会导致free函数出错返回,并不释放任何内存。
其他出错情况也大多由于类似原因,比如传递了错误的指针,该指针已经被释放或与空闲空间中的某个区块重叠等。


你可能感兴趣的:(C语言)