Возможно, переменная 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;

Но когда я реализую свой код, следуя этой структуре, я получаю предупреждение о том, что моя переменная Registry, возможно, не была инициализирована в строке, где я освобождаю объект TRegistry.

Итак, мне интересно, не найдены ли примеры, которые я нашел, для правильного доступа к реестру. Должен ли я звонить Free на мой объект TRegistry независимо от того, будет ли Create suceeeds и просто игнорировать предупреждение? Должен ли мой блок try/finally только окружать код после успешного вызова конструктора, но не завершать вызов create? Что-то еще?

Ответ 1

В вашем коде, если TRegistry.Create вызывает исключение, переменная Registry не будет назначена. И, наконец, попытка будет пытаться получить доступ к неинициализированной переменной.

Правильный способ написания кода - убедиться, что переменная назначена перед входом в блок try/finally.

Registry := TRegistry.Create;
try
  //additional code to access and use the registry object could go here
finally
  Registry.Free;
end;

Это самый фундаментальный шаблон управления жизненным циклом в кодировке Delphi, и вы должны глубоко посвятить его мышце.

Обратите внимание, что если конструктор выходит из строя, он будет убирать частично сконструированный объект перед распространением исключения. Новая ссылка на объект Registry в этом коде назначается только в том случае, если конструктор успешно завершен.

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