欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言:free出错导致程序无法正常运行,并且不报错误

程序员文章站 2023-12-27 10:17:27
...

今天遇到这样一个问题:

malloc申请空间,free释放时出错,程序无法正常运行,并且不报错误!

通过下断点找到错误: 

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

 

相关标签: 经典错误

上一篇:

下一篇: