Ви маєте на увазі, як вручну потрібно звільнити пам'ять, закрити файли, речі подібного роду? Якщо так, я б сказав мінімум і, як правило, менше, ніж більшість інших мов, якими я користувався, особливо якщо ми це узагальнюємо не лише для "управління пам'яттю", але "управління ресурсами". У цьому сенсі я насправді думаю, що 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 ++ так, як це було практично завжди призначено для використання, то управління пам'яттю є повністю автоматизованим, і взагалі це не те, з чим вам доведеться вручну мати справу (або з якою слід мати справу).