0

所以,

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

我有以下代码:

    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[] 会不会导致“旧”jon[] 留在内存中?

谢谢!

4

3 回答 3

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
于 2013-02-10T04:58:54.920 回答
3

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

于 2013-02-10T05:00:06.683 回答
1

最后一个display电话试图显示与您刚刚删除jon的内容相同的内容!newArr因此行为将是未定义的。

于 2013-02-10T04:59:54.633 回答