2012-03-17 10 views
10

He agregado un código a mi proyecto delphi para interactuar con el registro, usando algunos tutoriales que encontré en línea para guiar mi esfuerzo. Todos los ejemplos que he visto parece utilizar esta estructura para su acceso al registro:La variable Delphi podría no haberse inicializado advertencia

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

Pero cuando implemente el código siguiente al estructura, que estoy recibiendo una advertencia de que mi registro variable no puede haber sido inicializado en la línea donde libero el objeto TRegistry.

Entonces, me pregunto si los ejemplos que he encontrado son incorrectos en la forma correcta de acceder al registro. ¿Debo llamar gratis a mi objeto TRegistry independientemente de si el Create tiene éxito e ignoro la advertencia? ¿Debería, en cambio, mi bloque try/finally solo rodear el código después de la llamada al constructor exitosa, pero no envolver la llamada create? ¿Algo más?

Respuesta

22

En su código, si TRegistry.Create lanza una excepción, la variable Registry no se asignará. Y así, finalmente, intentará acceder a una variable no inicializada.

La forma correcta de escribir el código es asegurarse de que la variable esté asignada antes de ingresar al bloque try/finally.

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

Este es el patrón de gestión de vida más fundamental en la codificación Delphi y debe comprometerlo profundamente con la memoria muscular.

Tenga en cuenta que si el constructor falla, entonces ordenará el objeto parcialmente construido antes de propagar la excepción. La nueva referencia de objeto, Registry en este código, solo se asigna si el constructor finaliza correctamente.

Espero que los ejemplos que encontraste se escribieron de hecho según mi código anterior y de alguna manera los transcribiste incorrectamente. Si se escriben según la pregunta, entonces claramente están en error.

+0

¿Necesito hacer una comprobación adicional después de Crear antes del bloque de prueba para asegurarme de que el Registro se inicializó bien? –

+0

Y solo por ejemplo, http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=656&lngWId=7 sería uno de los tipos de tutoriales que encontré que de hecho parece erróneo, de ahí la pregunta para tratar de entender si ese código realmente se parece a lo que un desarrollador delphi más avanzado haría o no. –

+0

¡Claramente necesita encontrar mejores fuentes que ese sitio! –

Cuestiones relacionadas