malloc/new是一样的原理
如果你分配内存后,用分配的内存存储了一系列值,最后delete/free报错。
我遇到的有两种可能:
- 你的new定义的指针的地址在写代码过程中变化了,等于了另外一个变量的指针,则此时delete的是指针指向的那个变量的内存,则会报错。(如果你的指针等于了别的地址,那么原来申请的地址及其后的内存又有何用呢?用不上了啊,所以这样用不对)
- 如果你用new定义的指针p,先给其赋值,后输出对应的值,操作结束后p的指针还是其刚定义那会儿的初始地址值吗?不是的话,那么delete的是p现在的地址及其后面的值,不是p的内存大小,就会报错。 如果你的p指针,初始地址为0x000000,大小为5个int值,赋完5个int值后,p指向的地址变为0x000014。我们应该delete的是0x000000及以后的内存,但是由于地址变化,delete变成了删除0x000014 后面的内存,这会报错。
- 解决办法:事先定义一个指针a,令其等于p指针未赋值前的地址,
a=p
。 最后delete p之前,令地址变化后的p等于回自己的初始地址值p=a
,再进行delete操作,就会不报错。
int *p = new int[5];
int a[5]{1,2,3,4,5};
p=a;//此处p的值已经变为a[1]的地址值,因为delete会出错。
*********************************************************
//改正
int *p = new int[5];
int a[5]{1,2,3,4,5};
int *b=p;//用一个变量记录P的初始值
for (int i=0;i<5;i++)//p
{
*p=a[i];
p++;
}
p=b;//p的值恢复初始地址值,用b来输出,则p一直保持的是初始地址值。
for(int i=0;i<5;i++)
{
cout<<*b<<endl;
b++;
}
delete []p//删除的为p内存