es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 que new 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 tipo free_throw. El puntero ptr 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 que jolly sea una referencia a la nueva estructura. Hay un problema con este enfoque: debes usar delete para liberar la memoria asignada por new cuando la memoria ya no se necesite. Una llamada a clone() oculta la llamada a new, 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?

Tags:  , , , ,

Answer

  1. Avatar for 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 con delete.

    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 de ft en esta ubicación desconocida, lo que puede resultar en un comportamiento indefinido. El enfoque correcto sería asignar memoria para ptr utilizando new y luego asignar el valor de ft a la ubicación de memoria a la que apunta ptr.

    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 operador new debe usarse explícitamente en la función para asignar memoria a la estructura.

Comments are closed.