删除数组指针

时间:2013-02-10 04:55:59

标签: c++ pointers reference

SO,

我遇到了一个我无法弄清楚的错误(除非我的理解是错误的)。

我有以下代码:

    int doubleSize=size*2;
    int *newArr = new int[doubleSize];
    for(int i=0; i<size; i ++) {
        newArr[i]=jon[i];
    }
    size*=2;

    display(newArr);
    jon=newArr;
    display(jon);
    delete[] newArr;
    display(jon);

在第一次和第二次通话之后,我得到了我想要/期望的内容。在第三个显示调用上,0和1索引是内存地址,索引中的其余值与前2个调用匹配。可能导致这种情况的原因是什么?

我还有另一个跟进问题,我有代码,不会删除jon []导致'old'jon []留在内存中?

谢谢!

3 个答案:

答案 0 :(得分:3)

你有未定义的行为,所以任何事情都可能发生。

int *newArr = new int[size*2];
// now newArr is a pointer to a memory area
jon=newArr;
// now jon is a pointer to the same area, whatever jon pointed to before is leaked
delete[] newArr;
// now the memory area no longer exists
display(jon);
// using jon is now illegal, it has the address of a deleted memory area

可能正确的解决方案是:

int *newArr = new int[doubleSize]; // allocate a new area
for( int i=0; i<size; ++i ) {       // fill it in
    newArr[i] = jon[i];
}
delete [] jon; // get rid of the old area we don't need anymore
jon = newArr;  // now jon is linked to our brand new data in a brand new area

答案 1 :(得分:3)

当您delete[] newArr时,您正在取消分配地址newArr的内存。由于jon也指向同一个内存(因为你设置了jon = newArr),因此内存被一些其他值(可能在你的display函数中)覆盖。您需要做的是使用一些复制功能(如memcpy)将数据复制到jon新分配的块,而不仅仅是jon与{newArr相同的位置。 1}}。

答案 2 :(得分:1)

上一次display来电正试图显示与jon相同的newArr - 您刚删除的内容!因此行为将是不确定的。