最近在改一个纯c的算法,遇到了很多内存泄漏,访问越界等问题,这种问题只要出现就是段错误,很头疼。
我是通过vargrind解决了大部分的内存错误问题。
这是使用方法,我就贴一下,大家看一下。
https://blog.csdn.net/stpeace/article/details/61622214
https://blog.csdn.net/liu0808/article/details/79046022
下面我总结一下我遇到的内存错误,以及怎么解决
1,内存访问越界
这种错误有的时候并不是在你访问越界的时候才会报错,这个我也不知道为什么,现象是这样,会在你释放内存的时候出现段错误,好在这个错误,vargrind会帮你定位,报错信息类似于:
Invalid write of size 1
==20683== at 0x406477: main (main.c:293)
==20683== Address 0x55743c5 is 12 bytes after a block of size 361 alloc'd
==20683== at 0x4C2DBB6: malloc (vg_replace_malloc.c:299)
==20683== by 0x405160: new_cvector (matrix.c:299)
==20683== by 0x40510A: copy_cvector (matrix.c:287)
==20683== by 0x406370: main (main.c:283)
这个报错的意思是你访问了一个361大小的内存块的后面12个内存,这就是越界了,需要查一下你的数组尺寸
2,内存释放的时候段错误
free(ptr)的作用如下:
如果指针内存释放了,那么这部分的值有几种可能
1,还是原来的值
2,被清空为0,取决于平台和编译器的处理
3,被别人分配去了,已经修改了值
内存在释放之后,最好将指针置为空,如果不是空,那么你用该指针访问,那么会出现段错误
3,malloc内存不要重复申请
我在调用一个函数的时候,将二级指针传入,在函数内存malloc了一级数组的内存,然后在函数外又maloc了,这样也会导致段错误
只是我遇到的我写下了,不是专门做c的,遇到了,就写一下,希望能帮到大家,欢迎留言讨论