大家好,我是一名计算机系的大二学生,我在日常的编译中经常会出现段错误,或者底层内存申请失败会触发系统crash异常。请问是什么原因,该怎么解决?求教!
出现你所述现象的原因可能是:
因为分配和释放内存的操作不成对,即业务开始运行时申请的内存在业务结束时没有进行释放,然后下次业务再次运行时又重新申请内存,导致内存不断减少,最终可能导致整个内存被耗尽,进而导致整个程序申请不到内存而崩溃。
重复创建线程,即底层或者应用层创建线程和删除线程处理不成对,导致重复创建相同业务的线程,而每创建一个线程都要从堆中分配一个栈空间,最终导致整个堆空间被耗尽。
数组越界,C语言实现层在使用一个数组类型的变量时,操作的索引号超过了实际分配的数组大小,就会导致内存越界到其他内存空间。可能会将其他内存空间的数据破坏导致系统程序异常。
栈溢出,即应用层创建线程时传入的栈空间大小小于业务实际运行需要的空间。这样可能导致业务运行过程的数据操作越界到其他内存空间,将其他内存空间的数据破坏导致系统程序异常。
要避免这些错误的话可以尝试少用动态内存分配的函数(尽量使用栈空间)。分配内存和释放内存尽量在同一个函数。尽量一次性申请较大的内存,而避免反复申请小内存(减少内存分割)。自行设计内存池管理内存。