首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-09-27 
动态分配数组并且对指针进行运算后为什么不能释放内存?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 使得大小信息没了才出错的吧

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

热点排行