firstPtr = tempPtr;
第一个 Ptr 现在指向与 tempPtr 相同的内存。
delete tempPtr;
您现在正在删除该内存,firstPtr 和 tempPtr 都指向同一个内存。
for (int i = 0; i < 5; i++) {
cout << firstPtr[i] << endl;
}
您正在访问已删除的内存,打印的值可以是任何值。
要得到我假设你想要的,你需要删除该行
firstPtr = tempPtr;
或者删除for后面的内存:
for (int i = 0; i < 5; i++) {
cout << firstPtr[i] << endl;
}
delete[] tempPtr;
请注意,在第二种情况下,您将遇到内存泄漏,因为firstPtr 最初指向的内存不再可访问。
完整且正确的代码如下:
int *firstPtr = new int [4];
for (int i = 0; i < 4; i++) {
firstPtr[i] = i;
}
int *tempPtr = new int[5];
for (int i = 0; i < 4; i++) {
tempPtr[i] = firstPtr[i];
}
tempPtr[4] = 4;
for (int i = 0; i < 5; i++) {
cout << firstPtr[i] << endl;
}
delete[] tempPtr;
delete[] firstPtr;
一些 ASCII 艺术:
firstPtr = new int[4];
firstPtr
|
+------++------++------++------+
| || || || |
| || || || |
+------++------++------++------+
for (int i = 0; i < 4; i++) {
firstPtr[i] = i;
}
firstPtr
|
+------++------++------++------+
| 0 || 1 || 2 || 3 |
| || || || |
+------++------++------++------+
int *tempPtr = new int[5];
for (int i = 0; i < 4; i++) {
tempPtr[i] = firstPtr[i];
}
tempPtr[4] = 4;
tempPtr
|
+------++------++------++------++------+
| 0 || 1 || 2 || 3 || 4 |
| || || || || |
+------++------++------++------++------+
所以现在,在记忆中,你有:
firstPtr
|
+------++------++------++------+
| 0 || 1 || 2 || 3 |
| || || || |
+------++------++------++------+
tempPtr
|
+------++------++------++------++------+
| 0 || 1 || 2 || 3 || 4 |
| || || || || |
+------++------++------++------++------+
你的下一行:
firstPtr = tempPtr;
这样做:
no longer pointed to by firstPtr
|
+------++------++------++------+
| 0 || 1 || 2 || 3 |
| || || || |
+------++------++------++------+
tempPtr
firstPtr - firstPtr now points here
|
+------++------++------++------++------+
| 0 || 1 || 2 || 3 || 4 |
| || || || || |
+------++------++------++------++------+
delete tempPtr;
tempPtr
firstPtr - firstPtr now points here
|
+------++------++------++------++------+
| x || x || x || x || x |
| || || || || |
+------++------++------++------++------+
所以现在,tempPtr 指向删除内存。希望这可以解决问题。