Работа с динамической памятью с помощью операций new и delete
В языке программирования С++ для динамического распределения памяти существуют операции new и delete. Эти операции используются для выделения и освобождения блоков памяти. Область памяти, в которой размещаются эти блоки, называется свободной памятью.
Операция new позволяет выделить и сделать доступным свободный участок в основной памяти, размеры которого соответствуют типу данных, определяемому именем типа.
Синтаксис:
new ИмяТипа;
или
new ИмяТипа [Инициализатор];
В выделенный участок заносится значение, определяемое инициализатором, который не является обязательным элементом. В случае успешного выполнения new возвращает адрес начала выделенного участка памяти. Если участок нужных размеров не может быть выделен (нет памяти), то операция new возвращает нулевое значение адреса (NULL).
Синтаксис применения операции:
Указатель = new ИмяТипа [Инициализатор];
Операция new float выделяет участок памяти размером 4 байта. Операция new int(15) выделяет участок памяти 2 байта и инициализирует этот участок целым значением 15. Синтаксис использования операций new и delete предполагает применение указателей. Предварительно каждый указатель должен быть объявлен:
тип *ИмяУказателя;
Например:
float *pi; //Объявление переменной pi
pi=new float; //Выделение памяти для переменной pi
* pi = 2.25; //Присваивание значения
В качестве типа можно использовать, например, стандартные типы int, long, float, double, char.
Оператор new чаще всего используется для размещения в памяти данных определенных пользователем типов, например, структур:
struct Node {
char *Name;
int Value;
Node *Next
};
Node *PNode; //объявляется указатель
PNode = new Node; //выделяется память
PNode->Name = “Ata”; //присваиваются значения
PNode->Value = 1;
PNode->Next = NULL;
В качестве имени типа в операции new может быть использован массив:
new ТипМассива
При выделении динамической памяти для массива его размеры должны быть полностью определены.
Например:
ptr = new int [10];//10 элементов типа int или 20 байт
ptr = new int [ ];//неверно, т.к. не определен размер
Такая операция позволяет выделить в динамической памяти участок для размещения массива соответствующего типа, но не позволяет его инициализировать. В результате выполнения операция new возвратит указатель, значением которого служит адрес первого элемента массива.
Например:
int *n = new int;
Операция new выполняет выделение достаточного для размещения величины типа int участка динамической памяти и записывает адрес начала этого участка в переменную n. Память под саму переменную n (размера, достаточного для размещения указателя) выделяется на этапе компиляции.
int *b = new int (10);
В данном операторе, кроме описанных выше действий, производится инициализация выделенной динамической памяти значением 10.
int *q = new int [10];
В этом случае операция new выполняет выделение памяти под 10 величин типа int (массива из 10 элементов) и записывает адрес начала этого участка в переменную q, которая может трактоваться как имя массива. Через имя можно обращаться к любому элементу массива.
Есть ряд преимуществ использования new. Во-первых, операция new автоматически вычисляет размер необходимой памяти. Нет необходимости в использовании операции sizeof(). Более важно то, что она предотвращает случайное выделение неправильного количества памяти. Во-вторых, операции new автоматически возвращает указатель требуемого типа.
Для освобождения выделенного операцией new участка памяти используется операции:
delete указатель;
Указатель адресует освобождаемый участок памяти, ранее выделенный с помощью операции new.
Например:
delete x;
Для освобождения памяти, выделенной для массива, используется следующая модификация той же операции:
delete [ ] указатель;
Операцию delete следует использовать только для указателей на память, выделенную с помощью операции new. Использование delete с другими типами адресов может породить серьезные проблемы.
Пример 1. Демонстрация выполнения операций с динамической памятью.
#include <iostream.h>
void main() {
int *pa, *pb;
pa = new int;
*pa = 21;
pb = pa;
cout << *pa << " " << *pb << "\n";
pb = new int;
*pb = 28;
cout << *pa << " " << *pb << "\n";
delete pa;
pa = pb;
cout << *pa << " " << *pb << "\n";
delete pa;
}
Результат выполнения программы:
21 21
21 28
28 28
Дата добавления: 2015-02-16; просмотров: 814;