常见内存错误总结
内存分配方式:
1:从静态存储区分配:全局变量,静态变量
2:从栈分配:局部变量,函数参数
3:从堆分配(动态内存分配):使用malloc或者new
原则:使用栈存储和静态存储就能满足要求,那么就不要使用动态存储(造成大得多额外开销)
常见的内存错误:
1:内存分配未成功
使用p==NULL来判断是否为空可以避免这个问题或者使用异常处理语句来处理错误
2:分配成功但是没有初始化
全局变量和静态变量以及数组会自动初始化为0,但是其他类型的数据就是随机系统初始化的,时刻保持一种习惯,创建变量的同时就赋空或者0
3:内存分配成功,但是操作越界,比如在排序算法循环中,经常没有控制好循环控制变量就很容易出现越界
4:忘记了释放内存或者释放了部分内存,造成内存泄漏。开始的时候觉得没有什么,当多次出现这个情况就会出现oom
动态分配的内存 malloc和free配对,new delete配对,java中比如各种流打开也要配对关闭,不要太指望gc会自己处理,他只是个机器。
5:释放了内存却还在继续使用
常见的为函数返回指向“栈内存”的指针或者是引用,它使局部作用的变量,函数结束就会自动释放了
6:释放了内存,但是没有重新滞空,产生野指针
! free只是释放了该指针指向的内存,但是它作为一个独立的变量还是会存在的,不给他赋值他就乱指形成野指针。
7:误以为动态分配的内存会自动释放(很容易忽略!)
void funTest(){
char *p=(char *)malloc(100);
}
调用该函数后分配的指针变量p为局部变量会自动释放,但是他指向的内存并不会释放
a:指针释放,不代表指向的内存释放;
b:内存释放,不代表指针释放;