Возможно, переменная 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 в этом коде назначается только в случае успешного завершения конструктора.

Я надеюсь, что примеры, которые вы нашли, были на самом деле написаны в соответствии с моим кодом выше, и вы как-то неправильно их расшифровали. Если они написаны в соответствии с вопросом, то они явно ошибаются.