firstPtr = tempPtr;
first Ptr теперь указывает на ту же память, что и tempPtr.
delete tempPtr;
Вы сейчас удаляете эту память, на которую указывают одна и та же память как firstPtr, так и tempPtr.
for (int i = 0; i < 5; i++) {
cout << firstPtr[i] << endl;
}
Вы обращаетесь к удаленной памяти, напечатанные значения могут быть любыми.
Чтобы получить то, что, как я предполагаю, вы хотите, вам нужно удалить строку
firstPtr = tempPtr;
или удалите память после:
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 art:
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 указывает на удаление памяти. Надеюсь, это прояснит ситуацию.