Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мищишин електронка.doc
Скачиваний:
1
Добавлен:
08.12.2018
Размер:
1 Мб
Скачать
☆

Void main(void)

{

int *int_array = new int[1000];

float *float_array;

int i;

if (int_array != NULL)

{

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

int_array[i]= i + 1;

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

cout << int_array[i] << ' ';

delete int_array;

}

float_array = new float[2000];

if (float_array != NULL)

{

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

float_array[i] = (i + 1) * 1.0;

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

cout << float_array[i] << ' ';

delete float_array;

}

}

Як правило, програми повинні звільняти пам'ять за допомогою оператора delete.

32. Керування вільною пам'яттю

Програми можуть використовувати оператор new для динамічного розподілу вільної пам'яті (розділ 31). Якщо ж new не може виділити запитуваний програмою об’єм пам’яті, тоді він повертає вказівнику значення NULL.

Однак у програмах new може виконувати і інші дії (відмінні від повернення значення NULL). Для цього вам слід заздалегідь описати функцію, що буде виконуватись, якщо пам'яті недостатньо. Наприклад, наступна функція end_program виводить на екран повідомлення, а потім використовує функцію бібліотеки етапу виконання exit для завершення програми:

Void end_program(void)

{

cout << "Запит на пам'ять не може бути задоволений"

<< endl;

exit(1);

}

Щоб заставити C++ викликати функцію end_program, якщо new не може задовольнити запит на виділення пам'яті, вам необхідно викликати функцію set_new_handler, вказавши їй функцію end_program як параметр:

set_new_handler(end_program);

Наступна програма END_FREE.CPP викликає функцію end_program, якщо new не може задовольнити запит на виділення пам'яті [1]:

#include <stdlib.h> // Прототип exit

#include <new.h> // Прототип set_new_handler

Void end_program(void)

{

cout << "Запит на виділення пам'яті не може бути задоволений"

<< endl;

exit(1);

}

Void main(void)

{

char *pointer;

set_new_handler(end_program);

do {

pointer = new char[10000];

cout <<"Виділено 10000 байт" << endl;

} while (1);

}

В цьому випадку програма просто завершується, якщо new не може виділити пам'ять. Залежно від потреб вашої програми ви можете використовувати функцію для виділення пам'яті з іншого джерела, наприклад, з розширеної пам'яті комп'ютера, яка існує в середовищі MS-DOS. Крім того, ваша програма може звільнити пам'ять, розподілену нею для інших цілей, за допомогою оператора delete. C++ надає вам повний контроль над процесом розподілу пам'яті.

Створення власних операторів new і delete

Як ви вже знаєте, C++ дозволяє вашим програмам перезавантажувати оператори. Аналогічно ви можете перезавантажити оператори new і delete, щоб змінити їх призначення. Наприклад, припустимо, що ви виділяєте 100 байт пам'яті для зберігання секретних даних про вашу компанію. Коли ви надалі звільняєте цю пам'ять за допомогою оператора delete, звільняється буфер, який містив цю пам'ять, тобто ті самі 100 байт, що містять секретні дані про вашу компанію. Припустимо, корпоративний шпигун (і програміст) має доступ до вашого комп'ютера, його програма теоретично може розподілити той самий 100-байтний масив в пам'яті вашого комп'ютера і вивчити ваші таємниці. Перезавантажуючи оператор delete, ваша програма може спочатку заповнити цей буфер нулями або іншими безглуздими символами, а потім звільнити цю пам'ять. Наступна програма MYDELETE.CPP перезавантажує оператор delete. Вона спочатку перезаписує 100 байт, на які указує вказівник, а потім звільняє пам'ять, використовуючи для цього функцію бібліотеки етапу виконання free:

static void operator delete(void *pointer)

{

char *data = (char *) pointer;

int i;

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

data[i] = 0;

cout << "Таємниці в безпеці!" << endl;

free(pointer);

}