内存分配在C++编程的过程中是一个很重要的内容,对于面向对象编程,设计到自己分配内存,那么对于内存就要合理的使用和合理的释放,否则将会影响程序的运行及消耗
内存泄露错误:
发生内存使用错误是一件非常麻烦的事情,因为编译器不能自动的发现这些错误,他们通常在程序运行的时候跑出来,所以增加了编程的难度。常见的内存错误可以归结为以下的几个方面:
1、内存未分配成功,却使用了他,
编程经验少的人就经常会犯这样的问题,觉得内存申请分配就一定会成功,常用的方法的是在使用内存之前检查指针是否为NULL,如果指针p是函数的参数,那么在函数的入口用assert(!p == NULL)进行检查,以免传人非法的参数,如果使用的是malloc()或者是new来申请内存,那么应该用if(!p == NULL)或者if(p == NULL)或者捕获异常来进行处理。
2、内存分配成功,却没有初始化使用他
这样的错误的原因有以下两种:1,没有初始化的意识,2是误以为分配好的内存默认的赋值全为0,导致引用初始值错误,
3、内存分配成功并初始化,但是在操作时越界
在使用数组的时候通常多1或者是少1的操作,特别是在for循环中,循环的次数特别的容易搞错,导致数组元素访问越界。
4、忘记释放内存或者是只释放了一部分的内存,造成内存的泄露,可能在调用一次函数的时候,少释放了一点内存没有关系,但是在频繁的调用函数的时候,忘记释放的内存就会越来越多,最终导致程序卡死,显示内存耗尽,这种情况在动态分配内存的时候很有可能就会出现这样的错误。对此的解决办法是,动态内存的申请和释放是成对的出现的,程序中的malloc()和free()的函数的出现次数一定是相同的,不然就一定会出现错误。
5、释放了但是还在使用,具体的有以下几种情况:
1.在函数的实现中,程序复杂,并不能确定某一个对象是否已经释放的,此时应该重新设计数据结构,从基本上解决数据混乱的问题
2.函数的return语句写错了,注意不要返回指向栈内存的指针或者是引用,因为该内存在函数结束时被自动释放。
3.使用free()和delete释放内存后,没有将指针置为NULL,产生了野指针。
4,多次释放同一块内存
注意:
用malloc或者new申请内存之后,应该立即检查指针值是否为NULL或者是做异常的处理,以防止使用值为NULL的指针。
不要忘记初始化指针,数组和动态内存,防止将未初始化的指针作为右值。
避免数组或指针的下标的数组越界,特别要当心发生加1或者时少1操作
动态内存的申请和释放必须配对,防止内存泄露。
用free和delete释放内存之后,立即将指针设置为NULL,防止产生野指针。
关于malloc/free 和new /delete的区别
malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。
注意:malloc/free是库函数,new/delete是运算符
malloc/free不能执行构造函数与析构函数,而new/delete可以
new/delete不能在C上运行,所以malloc/free不能被淘汰
两者都必须要成对使用
C++中可以使用_set_new_hander函数来定义内存分配异常的处理