Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Статическая динамическая переменная. Работа с динамической переменной после освобождения памяти, занимаемой ею

#cpp #память #переменные


Два вопроса:


Корректно ли создавать динамическую переменную со спецификатором static?

static int *i = new int; - верно?
Можно ли работать с дин.переменной после её удаления: 

int *i = new int;
delete i;
i = new int;


    


Ответы

Ответ 1



Да, корректно, почему нет? Да, можно. Причём во многих библиотеках примерно так делается. Вы удаляете не переменную i, а освобождаете память, на которую указывает указатель i, и после этого его можно заставить указывать на новую область памяти.

Ответ 2



Давайте кое-что проясним. int *i это переменная типа указатель на int. Когда вы пишете delete i; вы не удаляете переменную, вы удаляете то, на что она указывает. Другими словами так делать можно: int *i = new int; delete i; i = new int; Потому что вы работаете с переменной типа указатель на int, которая цела и невредима. А так делать нельзя int *i = new int; delete i; *i = 42; Потому что вы работаете у переменной типа int, которая была удалена. Теперь, когда мы это прояснили, автоматически все стало понятно и с первым вопросом. Да, так делать можно. Вы создали статическую переменную типа указатель на инт, и инициализировали её указателем на переменную типа int, которая находится в динамической памяти

Комментариев нет:

Отправить комментарий