Освобождение памяти в С++

204
12 апреля 2019, 04:20

Предположим есть указатель на другой указатель. Я меняю значение этого указателя (например, на nullptr). Вопрос: очищается ли память, выделенная под другой указатель?

Answer 1

Обнуление (как и любое другое изменение) значений обычных «сырых» указателей в c++ не приводит к какому-либо освобождению памяти, на которую они указывают. Но совершенно свободно могут привести к утечке памяти. Обычный указатель легковесен, он не обладает какими-то скрытыми возможностями для управления адресованной им памятью. Представляйте указатель как обычный простой адрес памяти и всё будет ясно. Уничтожение письма с адресом не приводит к уничтожению дома, расположенного по этому адресу. Таким образом говорить о том, чтобы изменение значения указателя влияло на память — нельзя, а уж при добавлении еще одного косвенного указателя тем более. Если нужно освободить динамически выделенную через new/new[] память по указателю, следует использовать соответствующий оператор: delete для скалярных величин или delete[] для массивов. Более того, даже после освобождения памяти сам указатель никак не изменяется и не обнуляется автоматически. Если нужно его пометить свободным после удаления, требуется вручную присвоить ему новое значение, например, тот же самый nullptr.

Если нужно, чтобы изменение значения указателя влияло на память, адресуемую этим указателем, он должен быть нечто большим, чем просто адресом. В частности для этого придумали «умные» указатели — классы-обёртки, в функциях (и конструкторах/деструкторах в особенности) которых реализовано необходимое дополнительное поведение.

В стандартном c++ для этих целей существуют такие классы как std::unique_ptr и std::shared_ptr.

READ ALSO
Как сделать проверку на то, помещается ли значение в int?

Как сделать проверку на то, помещается ли значение в int?

Вот программа, которая по сути выводит сумму первых N элементов вектораКак выводить ошибку при попытке записи в int слишком большого числа?...

182
Функция setprecision c/c++ Особенности компиляторов

Функция setprecision c/c++ Особенности компиляторов

Написал вот такой код на visual-studio-2017:

205
Как в масив строк добавить ещё одну

Как в масив строк добавить ещё одну

Всё не так просто как кажется =) Есть переменная It, так вот её нужно вставить вместо The body of the message starts here\r\n Вот код =)

182
Помогите решить задачу 763 [закрыт]

Помогите решить задачу 763 [закрыт]

На бесконечной вправо и вверх шахматной доске находится ладьяДва игрока передвигают ее по очереди

193