动态内存常见错误总结

在写程序的时候最让程序员头疼的就是BUG,然而BUG又是不可避免的,当然如果能够提前知道会发生什么错误,那么在写的时候就可以尽量避免,为我们程序开发节省更多的时间。以下是常见的六种错误

1.申请的内存多次释放
2.内存泄漏
3.释放的地址不是开始时的地址
4.释放空指针
5.释放一个内存块,但是继续应用其中内容
6.越界访问

申请的内存多次释放

int main(){
    int* p = new int[20];
    //然后写代码。。。
    // 然后写代码。。。。
    delete[] p;
    //然后写代码。。。。
    //然后写代码。。。。
    delete[] p;//最后又释放一次程序挂掉
    return 0;
}

内存泄漏

int main(){
   int*  p = new int[20];
   //然后使用这块内存
   p[0]=0;
   //然后使用这块内存。。。
   // 一直使用。。。。

  return 0//到程序最后还是没有释放申请的内存 那么内存就会一直泄漏,然后使内存不断减小
}

这类错误单单看代码是看不出来哪里错了的,需要使用内存工具才能够找到,那样的话在解决这个BUG上就会花费挺长时间,提前预防将会减少我们所花费的时间

释放的地址不是开始的时候的地址

int main(){
 int*  p = new int[20];
 for(int i=0; i<20;i++){
  *(p++)=0;
 }
 delete[] p;//错误
return 0;
}

delete 释放的时候并不是开始申请的p的地址,因为在p++的时候地址已经变成了申请的数组的最后一个数的地址,我们申请的时候的地址是第一个数的地址,这样就会出现错误,所以我们应该注意我们地址是不是发生了变化,还是不是原来的地址

释放空指针

int main(){
 int*  p = NULL;
 int a;
 //写代码。。。。。
 //此处省略100行
 if(a==1){ // 如果a==1 成立的话 申请内存不成立则不申请
   p=new int;
}
 delete p;
return 0;
}

在条件不成立的时候如果还是释放了这个指针,那么程序就有可能挂掉,所以在释放内存的时候那么应该检查好

释放一个内存块,但是继续应用其中内容

int main(){
int* p = new int[20];
p[0] = 0;
//.....
//.....
delete[] p;
//.....
//....
p[0]=2;//错误因为已经释放了内存

return 0;
}

这是个简单的例子,当然实际开发当中的代码并不会那么简单,几百行几千行的代码并不会那么简单,但是这只是为了更好的表现出错误,看的更加清晰

越界访问

int main(){
int* p = new int[20];
for(int i=0;i<20;i++){
   *(p++);
}
for(int i=0;i<20;i++){
  *(p++);
}//错误
return 0;
}

上面这代码就是错误的,因为在第一个for循环当中,p的地址已经变成了数组最后一个数的地址,然后你又一个for循环,那么就越界了,值就发生了变化,也有可能会使程序挂掉

以上就是动态内存常见的六种错误,在我们写程序的时候就应该特别的注意,在释放内存的时候看看是否还是原来地址,是否越界。

传送门在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值