1、内存溢出和内存泄露的区别
1、内存溢出(out of memory)指程序在申请内存时候,没有足够的空间供其使用;例如说申请了一个int类型的内存,但是给他存入long型的数据,此时就产生溢出。
2、内存泄露(memory leak)指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,长久以往内存就被占光了。
2、内存分配方式
内存分配有三种方式:
1、全局存储区域分配:这时内存在程序编译阶段就已经分配好,该内存在程序运行的整个周期都有效,如:全局变量、static静态变量。
2、栈区分配:在执行函数的时候,函数中的局部变量的存储单元都可以从栈中分配,函数执行结束后这些存储单元都会被自动释放,实现从栈中分配存储单元运算操作内置于处理器的指令集中,效率很高 但是分配的内存容量有限。
3、堆中分配:也称为动态内存分配,在程序运行期间,可以使用malloc和new申请任意数量的内存单元,由程序员决定在什么时候使用free和delete释放内存
3、野指针
野指针是指向一个已删除的对象或未申请访问受限内存区域的指针。
例子:
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str); //指针已经释放,str变成野指针
if(str != NULL) //野指针无法用NULL来判断,只能人工规避
{
strcpy(str, “world”); //野指针再次被使用,会产生不可预料的结果
printf(str);
}
}
##注:
**malloc/new**是申请内存,告诉系统我要当前这块内存,其他人不可以用。
**free/delete**是释放内存,告诉系统当前这块内存我不用了,系统可以分配给其他人。
free/delete之后,当前的指针依然还是指向当前内存,当这块内存未分配给其他对象,依然可以使用当前指针读取数据,数据依然还是之前的,当前指针还是指向这块内存。若想尝试往这块内存写入数据,此时会产生不可预料的结果。
##误区
内存分配是向系统申请指定字节数的内存空间,申请完了系统将不会分配其他对象。
内存回收实质是告诉系统你可以分配给其对象了,内存单元中的数据还是存在的,其实就是垃圾值。
野指针规避方法:
1、初始化时置NULL;
2、释放后置NULL;
3、malloc/new判断是否申请内存成功(极少数出现不成功)。
4、僵尸对象
僵尸对象指的是1个已经被释放的对象,但是这个对象所占的内存空间还没有分配其他对象。(与野指针一样)
因此,通过野指针也是可以访问到僵尸对象。
已释放的僵尸对象如果内存单元未分配给其他人,访问还是正常的。如果分配给别人了,再去访问该内存就是非法的。