Нет, здесь нет утечки памяти.Конструктор возвращает новый ресурс только в случае успеха.Вы можете получить утечку, только если конструктор завершит работу и , если вам не удастся вызвать Free
.Поскольку вы ничего не делаете между конструктором и вызовом Free
, утечки быть не может.
Если конструктор дает сбой, тогда:
- Деструктор вызывается для освобождения любогоresources.
- Возникло исключение.
- Конструктор не возвращается, поскольку исключение изменяет поток программы.
- Присваивание переменной объекта,
c
в вашем примере, не происходит.
Обратите внимание, что ответ от @vcldeveloper, который вы приняли, неверен, когда указано, что nil
возвращается.Ничего не возвращается из конструктора, который вызывает.
Вы всегда должны обернуть пары Create / Free парами try / finally следующим образом:
obj := TMyClass.Create;
try
obj.DoSomething;
finally
obj.Free;
end;
Вам нужно только защитить ресурс как только он был назначен.Таким образом, вы помещаете try
после присваивания.
Если вы поместите try
перед конструктором, который является ошибкой:
try
obj := TMyClass.Create;
obj.DoSomething;
finally
obj.Free;
end;
Если конструктор завершится неудачей, тогда obj
не назначается, а затем, когда Free
запускается (и будет работать благодаря finally!), он вызывается для неинициализированной переменной, что приводит к неопределенному поведению.