您的位置:首页 > 其它

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

2016-04-20 16:09 295 查看


<span style="font-size:14px;">#include <stdio.h>
#include <stdlib.h>
int main(int argc, _TCHAR* argv[])
{
char *p =(char *)malloc(10);
p++;
free(p);
return 0;
}</span>


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

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

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


使用free(ptr)释放ptr指向的内存时并不需要提供要释放内存的大小,这是因为在ptr附近的某个位置存放有维护该内存区域的数据,这是由内存申请函数 malloc 等产生的。实际上在ptr之前有个结构体,指示了该块内存的信息。如果你的程序因为内存越界内修改了这个结构体,则会导致free函数出错返回,并不释放任何内存。
其他出错情况也大多由于类似原因,比如传递了错误的指针,该指针已经被释放或与空闲空间中的某个区块重叠等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: