русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Ефективне використання пам’яті класом String


Дата додавання: 2014-04-22; переглядів: 897.


Дві попередні програми насправді не потребують перезавантажень присвоювання та конструктора копіювання. Адже вони використовують вкрай прості класи з єдиним елементом даних, тому присвоювання та копіювання за замовчуванням і так працювали б коректно. Зараз ми розглянемо приклад, коли перезавантаження цьих операторів справді потрібне.

 

Недоліки класу String

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

s2=s1;

Але, якщо ми насправді перезавантажимо оператор присвоювання, постане питання, що ж робити з реальними рядками (тобто масивами символьного типу char), які є принциповими елементами даних для класу String.

Можна зробити так, щоб кожен об’єкт мав спеціально відведене «місце» для зберігання рядка. Тоді, присвоюючи один об’єкт класу String іншому, ми просто копіюємо рядок з вихідного об’єкту в об’єкт призначення, Але, якщо ми хочемо економити пам’ять, то зручніше працювати не з самими рядками, а з вказівниками на них. Тепер, присвоюючи значення одного об’єкта іншому, ми копіюємо тільки вказівник з одного об’єкту в інший. Обидва вказівники, звичайно, вказуватимуть на той сам рядок. При цьому ми зберігаємо в пам’яті тільки один екземпляр кожного рядку.

Але при цьому треба уважно слідкувати за видаленням об’єктів класу String. Якщо деструктор цього класу використовує delete для вивільнення пам’яті, зайнятої символьним рядком, і якщо є кілька вказівників на цей рядок, об’єкти так і залишаться з «завислими» вказівниками, вказуючими на місце, де давно нема рядка.

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

 


<== попередня лекція | наступна лекція ==>
Повернення результатів роботи функції | Клас-лічильник рядків


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн