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、改变指针的初始指向地址

猜你喜欢

转载自blog.csdn.net/W_J_F_/article/details/81325647