Возможно, переменная Delphi не была инициализирована предупреждением
Я добавил код в свой проект delphi для взаимодействия с реестром, используя некоторые учебники, которые я нашел в интернете, чтобы направлять свои усилия. Каждый пример, который я видел, похоже, использует эту структуру для доступа к реестру:
var
Registry: TRegistry;
begin
try
Registry := TRegistry.Create;
//additional code to access and use the registry object could go here
finally
Registry.Free;
end;
но когда я реализую свой код после этой структуры, я получаю предупреждение о том, что мой реестр переменных, возможно, не был инициализирован в строке, где я освобождаю объект TRegistry.
Итак, мне интересно, есть ли примеры, которые я нашел просто неправильно на правильном пути доступа к реестру. Должен ли я вызывать Free на моем объекте TRegistry независимо от того, является ли создание успешным, и просто игнорировать предупреждение? Вместо этого мой блок try / finally должен окружать только код после успешный вызов конструктора, но не обернуть вызов create? Что-то еще?
1 ответов
в коде, если TRegistry.Create
вызывает исключение, то Registry
переменная не будет назначена. И, таким образом, finally попытается получить доступ к неинициализированной переменной.
правильный способ написать код - убедиться, что переменная назначена, прежде чем вводить try/finally
заблокировать.
Registry := TRegistry.Create;
try
//additional code to access and use the registry object could go here
finally
Registry.Free;
end;
Это самый фундаментальный шаблон управления временем жизни в кодировании Delphi, и вы должны глубоко зафиксировать его в мышечной памяти.
обратите внимание, что если конструктор не удается, то он будет убирать объект распространить исключение. Ссылка на новый объект,Registry
в этом коде назначается только в случае успешного завершения конструктора.
Я надеюсь, что примеры, которые вы нашли, были на самом деле написаны в соответствии с моим кодом выше, и вы как-то неправильно их расшифровали. Если они написаны в соответствии с вопросом, то они явно ошибаются.