Отвечая на вторую часть вашего вопроса,
Существует ли какой-либо стандарт или процедура, которой необходимо следовать, чтобы убедиться в отсутствии утечки памяти в программе.
Да, есть.И это одно из ключевых отличий между C и C ++.
В C ++ вам никогда не следует вызывать new
или delete
в вашем пользовательском коде. RAII - очень распространенный метод, который в значительной степени решает проблему управления ресурсами.Каждый ресурс в вашей программе (ресурс - это все, что необходимо получить, а затем освободить: дескрипторы файлов, сетевые сокеты, соединения с базой данных, а также обычное распределение памяти, а в некоторых случаях - пары вызовов API (BeginX () / EndX (), LockY (), UnlockY ()) должны быть заключены в класс, где:
- конструктор получает ресурс (путем вызова
new
если ресурс является памятной записью) - деструктор высвобождает ресурс,
- копирование и назначение либо запрещаются (делая конструктор копирования и операторы назначения частными),или реализованы для правильной работы (например, путем клонирования базового ресурса)
Этот класс затем создается локально, в стеке или как член класса, а не Вызов new
и сохранение указателя.
Вам часто не нужно определять эти классы самостоятельно. Стандартные контейнеры библиотеки также ведут себя таким образом, поэтомуЛюбой объект, сохраненный в std::vector
, освобождается после уничтожения вектора.Опять же, не храните указатель в контейнере (который потребует you для вызова new
и delete
), а скорее сам объект (который дает вам памятьуправление бесплатно ).Аналогичным образом, классы интеллектуальных указателей могут использоваться для простого переноса объектов, которые просто должны быть выделены с помощью new
, и управления их временем жизни.
Это означает, что когда объект выходит из области видимости, он автоматически уничтожается,и его ресурс освобожден и очищен.
Если вы будете делать это последовательно по всему коду, у вас просто не будет утечек памяти.Все, что могло получить, привязано к деструктору, который гарантированно будет вызван, когда элемент управления выйдет из области, в которой был объявлен объект.