读书人

动态分配数组而且对指针进行运算后为什

发布时间: 2012-09-27 11:11:17 作者: rapoo

动态分配数组并且对指针进行运算后为什么不能释放内存?

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 使得大小信息没了才出错的吧

我是凭感觉说的啊,等待大牛说明下。
[解决办法]
探讨
C/C++ code
delete [] (p3 - 3);
如果我偏移好多位还是这种好。

读书人网 >C++

热点推荐