Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ - ООП.doc
Скачиваний:
11
Добавлен:
21.09.2019
Размер:
399.87 Кб
Скачать

Операции динамического выделения памяти new и delete

В С для динамического выделения и освобождения памяти используются функции malloc() и free(), а для определения размера необходимой памяти – операция sizeof. В C++ используются две операции – new и delete. Их форма использования:

pointer_var = new var_type;

delete pointer_var;

pointer_var – указатель - типа var_type;

Операция new выделяет соответствующее место для переменной в соответствующей области памяти и возвращает адрес выделенного места. Неуспешная попытка – возвращение нулевого указателя NULL.

Операция delete освобождает соответствующую память, на которую указывает pointer_var.

Удобство операции new состоит в том, что операция сама определяет размер переменной var_type автоматически и возвращает указатель, уже преобразованный к этому типу.

Пример выделения памяти под массив

pointer_var = new var_type[SIZE];

delete [SIZE] pointer_var; // или delete pointer_var;

Пример использования этих операций:

#include <iostream.h>

Void main(void)

{

int *p;

p=new int; // выделение памяти под целое

if(!p) {

cout<<”\n Недостаточно памяти!\n”;

return 1;

}

*p=20;

cout<<p<<endl;

delete p; // освобождение памяти

}

Пример работы с динамически выделенной памятью под массив:

#include <iostream.h>

Void main(void)

{

int *p;

unsigned int size;

cout<<”\n Введите размер массива:”;

cin>>size;

p=new int[size];

if(!p) {

cout<<”\n Недостаточно памяти!\n”;

return 1;

}

for(int i=0; i<size; i++)

p[i]=i*i; // использование *p++=i** меняет значение указателя

// получаем некорректность при освобождении памяти

int *q=p;

for( i=0; i<size; i++)

cout<<*q++<<” “; // корректно

cout<<endl;

delete p;

}

Динамическое выделение памяти целесообразно для выделения памяти под большие объекты, массивы, особенно под массивы неизвестного заранее размера. Часто динамическое выделение памяти используется в конструкторах класса, элементом которого является массив (массивы). При этом для выделения памяти под объект также может использоваться динамическое выделение памяти.

Пример класса queue с динамическим выделением памяти под массив.

#include <iostream.h>

class queue

{

int *q;

int sloc,rloc;

unsigned size;

public:

queue(int sz); // Конструктор

~queue(void); // Деструктор

void qput(int i);

int qget(void);

};

queue::queue(int sz)

{

size=sz;

if(!(q=new int[size]))

{

cout<,”\n Недостаточно памяти!\n”; return 1;

}

queue::~queue(void)

{

delete q;

cout<<”\n Очередь разрушена!”;

}

void queue::qput(int i)

{

if(sloc==size)

{

cout<<”\n Очередь полна!\n”;

return;

}

q[sloc++]=i;

}

int queue::qget(void)

{

if(sloc==rloc)

{

cout<<”\n Очередь пуста!\n”;

return 0;

}

return q[rloc++];

}

void main()

{

queue a(5), b(100); // объявили два объекта

a.qput(10);

b.qput(19);

a.qput(20);

b.qput(1);

cout<<a.qget()<<” “;

cout<<a.qget()<<” “;

cout<<b.qget()<<” “;

cout<<b.qget()<<” “;

queue *pq;

int s=20;

pq = new queue (s); // динамическое создание объекта

// именно сейчас вызывается конструктор queue

if (!pq)

{

cout<<”\n недостаточно памяти \n”;

return 0;

}

else

cout<<”\n Объект класса queue создан \n”;

for(int i=0; i<s;i++)

pq->qput(2*i+1); // заполнение очереди

for(i=0;i<s;i++)

cout<<pq->qget()<<” “;

cout<<endl;

delete pg;

}

При программировании на С++ создание объекта динамически и конструктор динамически выделяет память типичная ситуация.