Ты имеешь в виду, что нужно вручную освобождать память, закрывать файлы и тому подобное? Если это так, я бы сказал, минимум и, как правило, меньше, чем большинство других языков, которые я использовал, особенно если мы обобщим это не только для «управления памятью», но и «управления ресурсами». В этом смысле я на самом деле думаю, что C ++ требует меньше ручного управления ресурсами, чем, скажем, Java или C #.
Это происходит главным образом из-за деструкторов, которые автоматизируют уничтожение ресурса (памяти или иным образом). Как правило, единственный раз, когда мне нужно освободить / уничтожить ресурс вручную в C ++, это если я реализую структуру данных vlow-уровня (что большинству людей не нужно делать) или использую C API, где я просто провожу немного времени обертывание ресурса C, который необходимо вручную освободить / уничтожить / закрыть, в оболочку C ++, соответствующую RAII.
Конечно, если пользователь просит закрыть изображение в программном обеспечении для редактирования изображений, я должен удалить изображение из коллекции или что-то еще. Но, надеюсь, это не считается как управление «памятью» или «ресурсами», которое имеет значение в этом контексте, поскольку это требуется в любом языке, если вы хотите освободить память, связанную с этим образом в то время. Но опять же, все, что вам нужно сделать, это удалить изображение из коллекции, а деструктор изображения позаботится обо всем остальном.
Между тем, если сравнивать, скажем, с Java или C #, вы часто обнаруживаете, что людям приходится закрывать там файлы вручную, вручную отключать сокеты, устанавливать нулевые ссылки на объекты, чтобы их можно было собирать мусором, и т. Д. управление ресурсами на этих языках, если вы спросите меня. В C ++ вам часто даже не нужен unlock
мьютекс вручную, так как мьютекс-локатор сделает это автоматически, когда мьютекс выйдет из области видимости. Например, вы никогда не должны делать такие вещи в 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 ++ так, как его планировали использовать практически всегда, тогда управление памятью полностью автоматизировано, и, как правило, вам вообще не приходится (или нужно) иметь дело с этим вручную.