Ваше понимание верно.Шаблон
Acquire some resource
Do something
Release resource
в корне неверен, поскольку Do something
потенциально может вызвать исключение и утечку ресурса.Более того, вы должны помнить, что нужно освободить ресурс, который является плодородным источником ошибок.
Правильный способ, как вы указали, состоит в том, чтобы всегда использовать объект, деструктор которого освобождает ресурс,Это называется RAII в C ++.
Это означает, например,никогда не использовать delete
вне деструкторов или никогда не полагаться на ручное закрытие файловых дескрипторов, никогда не разблокировать мьютексы вручную и т. д. Узнайте об умных указателях и используйте их, когда сможете.
Обратите внимание, что некоторые языки (не C ++)укажите ключевое слово finally
, которое позволит вам выполнить блок инструкций независимо от того, было ли выброшено исключение.C ++ использует RAII, и вам никогда не следует беспокоиться об освобождении ресурсов, если вы пишете правильные деструкторы.
У меня есть небольшая утилита там для C ++ 0x, которая позволяет выполнять произвольный код в блокевыход, если вы один или два раза взаимодействуете с плохо написанными (или C) библиотеками.