Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Операція delete




Операція new

Керування пам’яттю: операції new i delete

Ми розглянули багато прикладів, в яких масиви використовувалися без врахування розміру пам’яті. В рядку

int arr1[100];

зарезервована пам’ять до 100 елементів типу int. Масиви є серйозним підходом до зберігання даних, але вони мають один недолік: ми повинні знати принаписанні програми, наскільки великий масив нам потрібен. Ми не можемо ввести розмір масиву в ході роботи програми. Наступний підхід працювати не буде:

cin>>size;

int arr[size];

 

Компілятор вимагає, щоб значення розміру масиву було константою.

Але в багатьох ситуаціях нам невідома потрібна кількість пам’яті до запуску програми. В такій ситуації ми можемо визначити розмір масиву більшим, що призведе до перевитрати пам’яті.

 

C++ пропонує інший підхід до виділення памєєяті – операцію new. Це універсальна операція, яка одержує пам’ять в операційної системи і повертає вказівник на початок виділеного блоку. В програмі, приведеній далі, показано, як це працює.

 

#include<iostream>

#include<string>

using namespace std;

 

int main()

{char* str=”abcd efgh ijklm n”;

int len=strlen(str);

char* ptr;

ptr=new char[len+1];

strcpy(ptr,str);

cout<<”ptr=”<<ptr<<endl;

delete[] ptr;

return 0;

}

 

Вираз

ptr=new char[len+1];

 

присвоює змінній ptr значення адреси блоку памєєяті, достатнього для зберігання рядка str, довжину якої можна одержати, використовуючи бібліотечну функцію strlen() плюс один символ для символа кінця рядка. Натомість функція strcpy() копіює рядок str у вказану ділянку пам’яті, на яку вказує вказівник ptr. Рядок повністю займає цю ділянку пам’яті, оскільки його розмір рівний довжині рядка str.

 

Якщо наша програма багато ділянок пам’яті, використовуючи операцію new, то теоретично вона може зайняти весь простір пам’яті, що призвекде до краху системи. Щоб уникнути цього і ефективно використати пам’ять, використовується операція delete. Вона призначена для вивільнення виділених ділянок пам’яті, повертаючи їх операційній системі. В попередній програмі рядок

delete[] ptr;

повертає системі пам’ять, на яку вказує вказівник ptr.

Насправді в останньому прикладі нам не потрібна ця операція, оскільки пам’ять автоматично вивільняється після завершення роботи програми, але такий прийом може бути корисним при використанні функцій.

Вмвільнення пам’яті не передбачає видалення вказівника, зв’язаного з цим блоком пам’яті, це і не зміна адреси значення, на яку вказує вказівник. Однак цей вказівник вже не має сили, пам’ять, на яку він вказує, може бути використана з іншою метою.

Квадратні дужки після операції delete вказують на те, що буде вивільнятися масив. При вивільненні пам’яті, виділеної для одинарного об’єкту, дужки не потрібні.

ptr=new some;

delete ptr;

Але при вивільенні пам’яті, зайнятої масивом, дужки обов’язкові. Їх використання передбачає, що ми вивільняємо пам’ять, використовувану для всіх членів масиву одночасно.

 

 





Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 299; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.