动态分配数组而且对指针进行运算后为什么不能释放内存
动态分配数组并且对指针进行运算后为什么不能释放内存?C/C++ code#include iostreamusing namespace std
动态分配数组并且对指针进行运算后为什么不能释放内存?
C/C++ code#include <iostream>using namespace std;int main(){ //常规测试 double * p3 = new double [3]; p3[0] = 0.2; p3[1] = 0.5; p3[2] = 0.8; cout<<"p3[0] = " <<p3[0] <<endl; cout<<"p3[1] = " <<p3[1] <<endl; cout<<"p3[2] = " <<p3[2] <<endl <<endl; //指针加减测试 p3 += 1; cout<<"p3[0] = " <<p3[0] <<endl; cout<<"p3[1] = " <<p3[1] <<endl; //释放动态数组 delete [] p3; return 0;}
请看“p3 +=1”和“delete [] p3”,这两条语句不能并存,并存的话编译是能通过,但是运行的时候,就“咚”的一声。
但把这两条语句随意注释其一就能正常运行,这是为什么啊?
[解决办法]修改了p3,再去释放当然就不对了。
[解决办法]动态分配的一块内村,在其前面都会有一个数据来描述这个内存块有多大,以便进行释放
而 执行了p3 += 1;之后,delete就找不到那个用于描述内存信息的数据了,因为p3的指向变了,所以...
[解决办法]delete [] p3是从p3开始起三个double指针。
delete [4] p3;
delete [16] p3;
delete [] p3;
这三种写法都一样,都只会释放3个double指针。p3加1,就会释放一个没有定义的double指针。
[解决办法]我不知道怎么理论化的告诉你,应该有告诉可以。不是你随便注释掉一句就没问题
而是只能注释掉p3 +=1 要不就内存泄露了。
至于为啥不能delete [](++p3);这个我从来没这个干过,但具体的理论不能这么干等待大牛解决下
个人感觉 delete []对应 new []
new []开辟的头地址应该会有一些基本的信息如大小,连接项指向下个地址。
delete[] 应该需要new[] 开辟内存大小的空间 你delete ++p3 使得大小信息没了才出错的吧
我是凭感觉说的啊,等待大牛说明下。
[解决办法]