Конструктор работает как любая другая функция.Локальные переменные размещаются в стеке и выходят из области видимости всякий раз, когда функция завершает свою работу, тогда как динамическое выделение памяти выполняется в стеке и должно быть явно освобождено (в C ++, а не в Java) до завершения функции.
Однако вваш случай
m_type = new Spec1(1);
new Spec1(1)
динамически размещается в куче и не будет уничтожен при завершении кода конструктора.Ссылка хранится в переменной-члене класса.Таким образом, до тех пор, пока экземпляр класса Container
находится в области видимости, можно использовать память, выделенную для Spec1(1)
.
Для сравнения просто рассмотрим другой сценарий.
Container(String type_message){
Base* m_type;
if (type_message.compare("We need Spec1")){
m_type = new Spec1(1);
} // add more ifs for other types (Spec2, Spec3 etc.)
}
Здесь каккак только конструктор завершит работу, m_type
выйдет из области видимости, но new Spec1(1)
останется в куче из-за утечки памяти.