Ви маєте на увазі, як вручну потрібно звільнити пам'ять, закрити файли, речі подібного роду? Якщо так, я б сказав мінімум і, як правило, менше, ніж більшість інших мов, якими я користувався, особливо якщо ми це узагальнюємо не лише для "управління пам'яттю", але "управління ресурсами". У цьому сенсі я насправді думаю, що C ++ вимагає менше ручного управління ресурсами, ніж, скажімо, Java або C #.
В основному це пов'язано з деструкторами, які автоматизують знищення ресурсу (пам'яті чи іншим чином). Як правило, єдиний раз, коли мені доведеться звільнити / знищити ресурс вручну в C ++, це якщо я впроваджую структуру даних рівнинного рівня (те, що більшості людей не потрібно робити) або використовую API API, де я просто витрачаю трохи часу загортання ресурсу C, який потрібно вручну звільнити / знищити / закрити в обгортку, відповідну RAII C ++.
Звичайно, якщо користувач просить закрити зображення в програмному забезпеченні для редагування зображень, я повинен вилучити зображення з колекції чи чогось іншого. Але, сподіваємось, це не враховується як "пам'ять" або "управління ресурсами" такого роду, що має значення в цьому контексті, оскільки це в значній мірі потрібно на будь-якій мові, якщо ви хочете звільнити пам'ять, пов'язану з цим зображенням на той час. Але знову ж таки все, що вам потрібно зробити, - це видалити зображення з колекції, а деструктор зображень подбає про інше.
Тим часом, якщо я порівнюю, скажімо, з Java або C #, ви часто зустрічаєте людей, які мають закривати файли вручну там, відключати розетки вручну, встановлювати посилання об’єктів на null, щоб вони могли збирати сміття тощо. Є набагато більше пам'яті вручну і управління ресурсами на цих мовах, якщо ви запитаєте мене. У програмі C ++ вам навіть не потрібно unlockвручну вводити файли mutex, оскільки шафка mutex зробить це автоматично для вас, коли mutex вийде за межі області. Наприклад, вам ніколи не потрібно робити такі речі в C ++:
System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
...
}
finally
{
if (file != null)
file.Close();
}
Не потрібно робити такі речі, як закриття файлів вручну в C ++. Вони в кінцевому підсумку автоматично закриваються, щойно вони виходять із сфери дії, незалежно від того, виходять вони із сфери застосування в результаті або звичайних, або виняткових шляхів виконання. Подібна річ для ресурсів, пов’язаних із пам’яттю std::vector. Такий код, як file.Close()описано вище, часто нападає на користь, особливо в умовах finallyблоку, який передбачає, що локальний ресурс потрібно звільняти вручну, коли цілий настрій навколо C ++ повинен автоматизувати це.
Що стосується ручного управління пам'яттю, я б сказав, що C вимагає максимум, Java / C # середню кількість, а C ++ мінімум серед них. Існує багато причин бути трохи сором’язливим використання C ++, оскільки це освоєння дуже важкої мови, але управління пам'яттю не повинно бути однією з них. Навпаки, насправді я думаю, що це одна з найпростіших мов у цьому одному аспекті.
Звичайно, C ++ дозволяє вам розпочати розподіл пам'яті вручну та виклик operator delete/delete[]вручну вільної пам'яті. Він також дозволяє використовувати функції C, як mallocіfree. Але це практики кодування в давньому стилі, які, на мою думку, застаріли задовго до того, як люди дадуть кредит, оскільки Струструп виступав за RAII, перш ніж він навіть дуже рано ввів цей термін. Тому я навіть не думаю, що справедливо говорити, що "сучасний C ++" автоматизує управління ресурсами, тому що це повинно було бути цілою метою. Інакше ви не можете отримати безпеку винятків. Просто багато спокусливих розробників на початку 90-х намагалися використовувати C ++ так, як C з об'єктами, часто повністю ігноруючи обробку винятків, і це ніколи не слід було використовувати таким чином. Якщо ви використовуєте C ++ так, як це було практично завжди призначено для використання, то управління пам'яттю є повністю автоматизованим, і взагалі це не те, з чим вам доведеться вручну мати справу (або з якою слід мати справу).