Referencia a una estructura Una estructura es un tipo de dato definido por el usuario en el que se puede almacenar una colección de variables de diferentes tipos de datos. La estructura se define utilizando la palabra clave “struct” seguida del nombre de la estructura y una lista de variables dentro de llaves {}. La definición de la estructura se puede colocar en la sección de declaración de variables global o local. Para acceder a los miembros de la estructura, se utiliza el operador “.” seguido del nombre del miembro.
Leí esta sección de un libro llamado C++ Primer Plus
(Página no. 400. Capítulo: 8 – Aventuras en Funciones)
Un segundo método es usar
new
para crear almacenamiento nuevo. Ya has visto ejemplos en los quenew
crea espacio para una cadena y la función devuelve un puntero a ese espacio.
Así es como podrías hacer algo similar con una referencia:
lang-c
const free_throws & clone(free_throw & ft)
{
free_throws * ptr;
*ptr = ft;
return *ptr;
}
La primera declaración crea una estructura sin nombre de tipofree_throw
. El punteroptr
apunta a la estructura, por lo que*ptr
es la estructura. El código parece devolver la estructura, pero la declaración de la función indica que la función en realidad devuelve una referencia a esta estructura. Podrías usar esta función de esta manera:
lang-c
free_throw & jolly = clone(three);
Esto hace quejolly
sea una referencia a la nueva estructura. Hay un problema con este enfoque: debes usardelete
para liberar la memoria asignada pornew
cuando la memoria ya no se necesite. Una llamada aclone()
oculta la llamada anew
, lo que hace que sea más fácil olvidar usar delete más tarde.
Mis dudas:
Según lo que sé, para las mejores prácticas nunca se debe desreferenciar un puntero sin inicializarlo y declarar un puntero a cierta estructura solo asignará espacio para el puntero y no para toda la estructura. Debes asignar espacio separadamente para la estructura.
Según este libro, declarar un puntero automáticamente asigna espacio para toda la estructura y el puntero se desreferencia sin inicializarlo.
¿Cómo se llama automáticamente al operador new
al llamar a la función?
davy.ai
Como modelo de lenguaje de inteligencia artificial, no tengo acceso al código fuera de lo que se proporciona en el fragmento dado. Sin embargo, es importante tener en cuenta que el código proporcionado en el libro no es la mejor práctica para declarar e inicializar un puntero. Como indica el libro, usar
new
para crear almacenamiento nuevo es un método alternativo, pero debe usarse con precaución, ya que puede provocar fugas de memoria si no se administra adecuadamente condelete
.En el código proporcionado, el puntero
ptr
no está inicializado y por lo tanto está apuntando a una ubicación desconocida en la memoria. Cuando se ejecuta*ptr = ft
, se intenta escribir el valor deft
en esta ubicación desconocida, lo que puede resultar en un comportamiento indefinido. El enfoque correcto sería asignar memoria paraptr
utilizandonew
y luego asignar el valor deft
a la ubicación de memoria a la que apuntaptr
.En cuanto a su pregunta sobre cómo se llama automáticamente al operador
new
al llamar a la función, no se llama automáticamente. El operadornew
debe usarse explícitamente en la función para asignar memoria a la estructura.