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 []留在内存中?
谢谢!
答案 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
- 您刚删除的内容!因此行为将是不确定的。