Мой инструктор говорит, что нам не нужно удалять одноэлементный объект, созданный в куче, потому что, когда он выходит из области видимости, его память освобождается и автоматически удаляется.
Это то, что компилятор обрабатывает статические объектыиначе что нам не нужно беспокоиться об удалении этого объекта из кучи?
Ваш инструктор ошибается.Динамически размещенный объект (например, созданный с помощью оператора new
) будет освобожден только в том случае, если он специально уничтожен (например, с использованием соответствующего оператора delete
).
Не имеет значения, является ли указатель на объектстатическая переменная.
Что происходит с большинством современных операционных систем, так это то, что операционная система освобождает память, используемую программой, когда программа завершается (обычно или ненормально).Однако это не вызывает вызов деструктора динамически размещаемого объекта.Если вы полагаетесь на вызываемый деструктор (а не на восстановление памяти), то вам нужно убедиться, что деструктор вызывается до завершения программы.Например, если объект управляет системным ресурсом, таким как мьютекс.
Стандарт C ++ не требует, чтобы динамически размещенные объекты освобождались при завершении программы.И большинство (если не все) современные операционные системы (Unix, Windows и т. Д.), Которые освобождают память для существующих процессов, возвращают память, не будут вызывать деструкторы динамически размещаемых объектов.
Существуют также операционные системы, которые непотрудитесь восстановить память завершающей программы - хотя использование таких систем в настоящее время менее распространено, программы, которые на них работают, должны быть специально спроектированы, чтобы гарантировать, что они правильно освобождают все динамически размещенные объекты.
Есть, конечно,методы, которые можно использовать для обеспечения освобождения динамически размещаемых объектов (например, сохранить указатель на эти объекты в std::unique_ptr
).Статический std::unique_ptr<T>
будет уничтожен при завершении программы, а его деструктор автоматически уничтожит любой динамически размещенный объект, которым он управляет.(Конечно, есть способы предотвратить это, например, позвонив по номеру std::abort()
).