utilizan - ¿Las variables delphi se inicializan con un valor por defecto?
tipos de datos que se utilizan en el lenguaje de programacion pascal (9)
Soy nuevo en Delphi y he estado ejecutando algunas pruebas para ver a qué variables de objetos y variables de pila se inicializan por defecto:
TInstanceVariables = class
fBoolean: boolean; // always starts off as false
fInteger: integer; // always starts off as zero
fObject: TObject; // always starts off as nil
end;
Este es el comportamiento que estoy acostumbrado de otros idiomas, pero me pregunto si es seguro confiar en Delphi. Por ejemplo, me pregunto si podría depender de una configuración de compilador, o tal vez funcionar de manera diferente en diferentes máquinas. ¿Es normal confiar en los valores inicializados por defecto para los objetos, o establece explícitamente todas las variables de instancia en el constructor?
En cuanto a las variables de pila (nivel de procedimiento), mis pruebas muestran que los booleanos unificados son verdaderos, los enteros unificados son 2129993264, y los objetos no inicializados son solo punteros no válidos (es decir, nulos). Supongo que la norma es establecer siempre las variables de nivel de procedimiento antes de acceder a ellos?
Aquí hay una cita de Ray Lischners Delphi in a Nutshell Chapter 2
"Cuando Delphi crea un objeto por primera vez, todos los campos comienzan vacíos, es decir, los punteros se inicializan en nil, las cadenas y los arreglos dinámicos están vacíos, los números tienen el valor cero, los campos booleanos son falsos y las variantes se configuran como no asignadas. (Ver NewInstance e InitInstance en el Capítulo 5 para más detalles).
Es cierto que las variables de ámbito local deben inicializarse ... Trataría el comentario anterior de que "las variables globales se inicializan" como dudosas hasta que se proporcione una referencia. No lo creo.
editar ... Barry Kelly dice que puedes confiar en que no se inicialicen por completo, y dado que está en el equipo de compiladores de Delphi, creo que está parado :) Gracias Barry.
Como nota al margen (ya que es nuevo en Delphi): las variables globales se pueden inicializar directamente al declararlas:
var myGlobal:integer=99;
Del archivo de ayuda de Delphi 2007:
ms-help: //borland.bds5/devcommon/variables_xml.html
"Si no inicializa explícitamente una variable global, el compilador la inicializa a 0."
Incluso si un idioma ofrece inicializaciones predeterminadas, no creo que deba confiar en ellos. Inicializar a un valor lo hace mucho más claro para otros desarrolladores que quizás no conozcan las inicializaciones predeterminadas en el lenguaje y evita problemas entre los compiladores.
Las variables globales que no tienen un inicializador explícito se asignan en la sección BSS en el ejecutable. En realidad, no ocupan espacio en el EXE; la sección BSS es una sección especial que el sistema operativo asigna y borra a cero. En otros sistemas operativos, hay mecanismos similares.
Puede confiar en que las variables globales tengan cero inicialización.
Las variables globales y los datos de instancia de objeto (campos) siempre se inicializan a cero. Las variables locales en procedimientos y métodos no se inicializan en Win32 Delphi; su contenido no está definido hasta que les asigne un valor en el código.
Los campos de clase son por defecto cero. Esto está documentado para que pueda confiar en él. Los valores acumulables locales no están definidos a menos que sean cadenas o interfaces, estos se establecen en cero.
Sí, este es el comportamiento documentado:
Los campos de objeto siempre se inicializan a 0, 0.0, '''', False, nil o lo que corresponda.
Las variables globales siempre se inicializan a 0, etc. también;
Las variables locales contadas con referencia siempre se inicializan a nil o '''';
Las variables locales no contadas por referencia * no están inicializadas, por lo que debe asignar un valor antes de poder usarlas.
Recuerdo que Barry Kelly en algún lugar escribió una definición para "referencia-contada", pero no puede encontrarla más, así que esto debería hacerlo mientras tanto:
reference-counted == que son contados por sí mismos o que contienen directa o indirectamente campos (para registros) o elementos (para matrices) que son contados como referencias:
string, variant, interface
o matriz dinámica o matriz estática que contiene dichos tipos.
Notas:
-
record
sí no es suficiente para convertirse en contado de referencia - No he probado esto con genéricos todavía
Tengo una pequeña queja con las respuestas dadas. Delphi elimina el espacio de memoria de los objetos globales y los objetos recién creados. Si bien esto NORMALMENTE significa que se inicializan, hay un caso en el que no son: tipos enumerados con valores específicos. ¿Qué pasa si el cero no es un valor legal?