Pregunta

Soy nuevo en Delphi, y he estado realizando algunas pruebas para ver a qué variables de objeto y variables de pila se inicializan de forma predeterminada:

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 al que estoy acostumbrado en otros idiomas, pero me pregunto si es seguro confiar en él en Delphi. Por ejemplo, me pregunto si podría depender de la configuración de un compilador, o quizás funcione de manera diferente en diferentes máquinas. ¿Es normal confiar en los valores inicializados predeterminados para los objetos, o establece explícitamente todas las variables de instancia en el constructor?

En cuanto a las variables de la pila (nivel de procedimiento), mis pruebas muestran que los booleanos unitializados son verdaderos, los enteros unitializados son 2129993264, y los objetos sin inicializar son simplemente punteros no válidos (es decir, no son nulos). ¿Supongo que la norma es establecer siempre variables de nivel de procedimiento antes de acceder a ellas?

¿Fue útil?

Solución

Sí, este es el comportamiento documentado:

  • Los campos de objeto siempre se inicializan a 0, 0.0, '', False, nil o lo que sea aplicable.

  • Las variables globales siempre se inicializan también a 0, etc.,

  • Las variables locales contadas de referencia * siempre se inicializan en nil o '';

  • Las variables locales sin contar con referencias * no están inicializadas, por lo que debe asignar un valor antes de poder usarlas.

Recuerdo que Barry Kelly en alguna parte escribió una definición para " reference-count contado " ;, pero no puede encontrarla más, así que esto debería hacer mientras tanto:

  

referencia = contados == que se cuentan como referencia ellos mismos, o   directa o indirectamente contienen campos (para registros) o elementos (para   matrices) que se cuentan como referencia: cadena, variante, interfaz   o array dinámico o array estático que contienen dichos tipos.

Notas:

  • record en sí no es suficiente para convertirse en referencia contada
  • No he probado esto con genéricos todavía

Otros consejos

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, existen mecanismos similares.

Puede depender de que las variables globales se inicialicen con cero.

Los campos de clase son cero por defecto. Esto está documentado para que pueda confiar en él. Las varaiables de la pila local no están definidas a menos que la cadena o la interfaz, se establezcan en cero.

Solo como una nota al margen (como usted es nuevo en Delphi): las variables globales se pueden inicializar directamente al declararlas:

var myGlobal:integer=99;

Aquí hay una cita de Ray Lischners Delphi en pocas palabras Capítulo 2

  

" Cuando Delphi crea un objeto por primera vez, todos los campos comienzan vacíos, es decir, los punteros se inicializan a cero, las cadenas y las matrices dinámicas están vacías, los números tienen el valor cero, los campos booleanos son falsos y las variantes son establecer en Sin asignar. (Consulte NewInstance e InitInstance en el Capítulo 5 para obtener más información). & Quot;

Es cierto que las variables locales en el alcance deben inicializarse ... Me gustaría tratar el comentario anterior de que " Las variables globales se inicializan " tan dudoso hasta que se proporcione una referencia, no lo creo.

editar ... Barry Kelly dice que puedes confiar en que no estén inicializados en cero, y ya que está en el equipo de compilación de Delphi, creo que eso se mantiene :) Gracias Barry.

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.

Incluso si un idioma ofrece inicializaciones predeterminadas, no creo que debas confiar en ellas. La inicialización a un valor hace que sea mucho más claro para otros desarrolladores que pueden no saber acerca de las inicializaciones predeterminadas en el idioma y previene problemas entre compiladores.

Desde el archivo de ayuda de Delphi 2007:

ms-help: //borland.bds5/devcommon/variables_xml.html

  

" Si no inicializas explícitamente una variable global, el compilador la inicializa a 0. "

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 este NORMALMENTE significa que están inicializados, hay un caso en el que no lo están: tipos enumerados con valores específicos. ¿Qué pasa si cero no es un valor legal?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top