new-delete问题归纳
动态内存申请中,new和delete的使用并不复杂,但是在使用中我们会碰到各种各样的问题,下面对这些问题做一下总结,以提醒我们在使用中规避这些问题。
1.指针被更改
在使用数组的时候,delete的必须是数组的首地址,否则编译器会报错
int *p;
p = new int[5];
p++;? //指针移动了
p = "abc";?
2. new和delete不成对出现
int *p;
{
p = new int;
}
{
delete p;
}
#include <iostream>
void func1(){
int *p;
p = new int;
}
void func2(){
int *p;
delete p;
}
int main(int argc, const char * argv[]) {
//new delete不成对
func1();
func2();
//事实上func1,func2中的2个p压根儿不搭界的
return 0;
}
3.delete 2 次
我们知道通常代码是很多人一起写的,本来自己就delete了,又被别人delete了一次,自己还发现不了问题。
int *p;
p = new int;
delete p;
...
delete p;
4.内存越界
int *p;
p = new int;
func(); //问题往往隐藏在func中,我们不知道func都干了些什么
delete p;
下面来模拟一下:
#include <iostream>
using namespace std;
void func(int *p)
{
int *m = p;
m++; //只申请了一个大小,却修改了下一个内存单元
*m = 3;
}
int main(int argc, const char * argv[]) {
int *p;
p = new int;
func(p);
return 0;
}