Когда память, выделенная под переменную, больше не нужна, ее следует освободить. Делается это с помощью оператора delete:
delete имя_указателя;
Примеры.
delete ps;
Повторное применение оператора delete к тому же самому указателю приведет к зависанию программы. Рекомендуется при освобождении памяти присваивать связанному с ней указателю нулевое значение. Повторный вызов оператора delete для нулевого указателя пройдет безболезненно для программы, например,
char *pc;
pc = new char;
*pc = 'a';
delete pc;
pc = NULL;
delete pc;
При освобождении памяти с самим указателем ничего не происходит и его можно снова использовать, присвоив ему новый адрес.
При невнимательной работе с указателями может возникнуть эффект утечки памяти. Это происходит, если указателю присваивается новое значение, а память, на которую он ссылался, не освобождается. Каждый раз, когда в программе используется оператор new, за ним должен следовать оператор delete.
Пример утечки памяти.
int *pi = new int; // Выделение памяти для хранения переменной типа int
|
|
*pi=72; // В выделенную память записывается значение 72
pi = new int; // Выделение новой области памяти
*pi =84; // Запись в новую область значения 84
После выполнения этих операторов память, содержащая значение 72, оказывается недоступной, поскольку указателю на эту область было присвоено новое значение. В результате невозможно ни использовать, ни освободить зарезервированную память до завершения программы (когда вся выделенная память освобождается автоматически).
Пример выделения, использования и освобождения динамической памяти.
#include <stdio.h>
int main()
{
int a=5;
int * pa = &a;
int *pheap = new int; // Выделение памяти под целую переменную
*pheap = 7;
printf(“a=%d, *pa =%d, *pheap=%d \n”, a, *pa, *pheap);
delete pheap; // Освобождение памяти, выделенной оператором new
pheap =pa; // Присвоение указателю нового значения
printf(“ *pheap=%d \n”, *pheap);
return 0;
}