C语言:free出错导致程序无法正常运行,并且不报错误
今天遇到这样一个问题:
malloc申请空间,free释放时出错,程序无法正常运行,并且不报错误!
通过下断点找到错误:
最终确定在malloc申请空间出错:
pNode pNewNode = (pNode)malloc(sizeof(pNode));
pNode是一个指针,只申请四个字节;
调用时则按照Node节点来进行储存,当free是出现错误!
free的原理:
free()释放的是指针指向的内存!注意!释放的是内存,不是指针!指针并没有被释放,指针仍然指向原来的存储空间。
指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!
只不过现在指针指向的内容的垃圾,是未定义的,
因此,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。
如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,
如果释放两次及两次以上会出现错误
(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
free()
申请的内存片段会存放着相应信息
(大多数实现所分配的存储空间比所要求的要稍大一些,
额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等)
错误使用时,会不经意修改这个信息,就会导致无法释放内存
我出现的问题是:
申请空间将指针当成了节点,释放时越界,但是系统不会报错,也不给提示警告。
当释放时,系统发现问题,无法进行下去,出现异常终端程序。
由此得来的教训就是,C语言中访问数组一定要注意越界的问题!!!
malloc后free出错总结:
1、malloc与free配套使用。(有申请有释放,有创建有销毁)
2、指向malloc申请的堆内存的指针,在运用过程中千万不要另外赋值,否则同样导致内存泄露
3、malloc后,实际使用时指针长度超过了你申请的范围。再去free时肯定出问题。 (我的错误原因)
4、改变指针的初始指向地址