在写程序的时候最让程序员头疼的就是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循环,那么就越界了,值就发生了变化,也有可能会使程序挂掉
以上就是动态内存常见的六种错误,在我们写程序的时候就应该特别的注意,在释放内存的时候看看是否还是原来地址,是否越界。
传送门