Указатели C ++ - операция удаления указателей массива - PullRequest
0 голосов
/ 12 мая 2018

Пока я использовал оператор удаления для указателей, я увидел нечто, чего я не мог понять.Я думаю, что лучше всего показать это на примере:

#include <iostream>
using namespace std;

int main() {

    int* p = new int[5]{3, 4, 5, 6, 7};

    cout << p[0] << p[1] << p[2] << p[3] << p[4] << '\n';

    delete[] p;

    cout << p[0] << p[1] << p[2] << p[3] << p[4] << '\n';

    return 0;
}

Результат:

34567
00567

После операции удаления, почему первые два элемента превратились в нули?Спасибо за внимание.Я с нетерпением жду ваших ответов.

Ответы [ 4 ]

0 голосов
/ 12 мая 2018

Когда вы «удаляете» указатель или переменную, нет оснований для его установки в «0».
Удаляя массив, вы просто сообщаете компьютеру, что он может свободно использовать данное пространство.Интересный вопрос не в том, почему остальные значения сохраняются, а в том, почему 2 первых установлены в «0», и ответ может быть действительно любым:

0 голосов
/ 12 мая 2018

Системе не нужно очищать эту память нулями.

delete [] просто означает, что эта память вам больше не нужна, и вы возвращаете эту память в систему.Система пометила эту память как свободную и перезапишет ее новыми данными в будущем.

0 голосов
/ 12 мая 2018

Вы не хотите платить за то, что вам не нужно в C ++.

Почему вы ожидаете, что освобожденная память обнуляется?delete просто помечает память как неиспользуемую, нет нужды обнулять ее, так как вы все равно не можете использовать ее, не вызывая неопределенное поведение.

0 голосов
/ 12 мая 2018
 delete[] p;

 cout << p[0] << p[1] << p[2] << p[3] << p[4] << endl;

В тот момент, когда вы используете p после вызова delete[] для него, это неопределенное поведение. Поскольку формулировка гласит, что поведение не определено, ставить под сомнение, почему x или y происходит бессмысленно, поскольку это неопределенно.

...