内存和野指针问题

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个已经被释放的对象,但是这个对象所占的内存空间还没有分配其他对象。(与野指针一样)
因此,通过野指针也是可以访问到僵尸对象。
已释放的僵尸对象如果内存单元未分配给其他人,访问还是正常的。如果分配给别人了,再去访问该内存就是非法的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值