C++ : Gestión de memoria con std::unique_ptr (Smart Pointers)

Поділитися
Вставка
  • Опубліковано 7 жов 2024
  • [C++ 2.5]: Serie completa bit.ly/CppGameD...
    Serie anterior C++: bit.ly/CppDev20...
    Librería TinyPTC UA: bit.ly/tinyPTC-...
    Exploramos el uso de #Smart-Pointers con std::unique_ptr para evitar problemas en la gestión de memoria, mejorando nuestras simples clases RAII. Aprendemos a usar #unique_ptr y #make_unique para reservar recursos, garantizando su liberación. Entendemos que son clases gestoras, que son propietarias de un único recurso y por tanto tienen reglas claras respecto a la reasignación, copy y move. Exploramos distintas dudas que salen y entendemos los detalles al respecto.
    Contenidos detallados:
    Definición básica del patrón RAII (Resource Acquisition is Initialization) completado justo en el vídeo anterior
    Detalle sobre uniform intialization
    Uso de std::unique_ptr como patrón RAII estándar para evitar la gestión manual de memoria
    Usando el puntero "crudo" contenido dentro de un std::unique_ptr mediante el método get
    Uso de std::make_unique para evitar invocar manualmente new al crear un std::unique_ptr
    Detalle básico, sin entrar en profundidad, de por qué usar make_unique respecto a las garantías de excepción
    Analizando el caso de asignación a un std::unique_ptr preexistente de un nuevo valor : cómo unique_ptr evita hacer delete más de una vez.
    Asignando un unique_ptr a otro unique_ptr : no es posible usar operador asignación, sólo un move.
    Entendiendo la operación de move de un unique_ptr a otro y de forma básica lo que son las rvalue-references.
    Entendiendo que el uso de un objeto tras haber sido "movido" a otro es comportamiento no definido. Aunque es posible hacerlo, no se debe.
    Problemas derivados de usos incorrectos de std::unique_ptr : no se debe hacer delete de los punteros crudos. Si usamos unique_ptr es para no hacer delete a mano en ningún sitio.
    Ventajas del uso de Smart Pointers como std::unique_ptr.
    Repartiendo responsabilidades : unique_ptr será propietario de los recursos, el puntero crudo puede pasarse a otros para que accedan, pero nunca deben gestionarlo.
    Cómo eliminar objetos gestionados mediante unique_ptr si están en un array crudo, asignando nullptr para forzar la llamada al destructor.
    Uso de using y/o auto para simplificar el uso de unique_ptr, limitándose a llamar a make_unique.
    Diferencias básicas entre typedef y using.
    Clase de Videojuegos 1 2019/20
    Grado en Ingeniería Multimedia
    Universidad de Alicante

КОМЕНТАРІ • 15

  • @diegopereira524
    @diegopereira524 4 роки тому +8

    Hace mas de 20 años que desarrollo en C y C++ con Proc C/C++ de Oracle y he visto la evolución del lenguaje desde el '98 cuando estudiaba en la universidad hasta hoy, y lo que explica el profe es excelente, los ejemplos, el uso de punteros y RAII, hasta la buena disposición a disipar las dudas!, Un maestro!. Saludos de Argentina y muy bueno este capitulo.

  • @alfoorego8380
    @alfoorego8380 3 роки тому +3

    Dios Santo, cómo se agradecen estos contenidos, además rematados con una utilísima descripción del vídeo. Mil gracias, profesor

  • @julianperez9157
    @julianperez9157 4 роки тому +1

    Video muy interesante. Espero ansioso mas vídeos sobre punteros inteligentes. Un saludo profe.

  • @berwick82
    @berwick82 2 роки тому +1

    Gracias por el video, es de gran ayuda !!

  • @andrewjackson508
    @andrewjackson508 4 роки тому +1

    yo me dije a mi mismo, para poder seguir el codigo claro, bueno eso es un puntero a un entero de 32 bits inicializado a null y segui con lo del memory leak , pero como decia el mercenario, imaginar es bueno, saber es mejor. gracias profe

  • @digimikeh
    @digimikeh 4 роки тому +3

    A Retroman solo le falta una cosa para ser 100% retro.... poner los colores de tipo Borland en su editor de codigo... y ya esta... ese fondo azul con letras blancas es nostálgico.

    • @coulombio
      @coulombio Рік тому +1

      ¿Las letras no eran amarillas? Pregunto.

    • @digimikeh
      @digimikeh Рік тому

      @@coulombio yo lo uso actualmente con NeoVim.. usa letras amarillas para reclamar la sintaxis de los tipos y operadores

  • @vicboma1
    @vicboma1 4 роки тому +2

    Una dudilla profesor, según la explicación del video, 'std::make_unique' actúa como un patrón de construcción muy similar a un 'Método factoria' no? A su vez, la instrucción 'std::unique_ptr' hace que se restrinja esa creación a un solo objeto en memoria. Estamos delante de una factoría de singletons dónde 'std::unique_ptr' almacena y 'std::make_unique' crea?

    • @ProfesorRetroman
      @ProfesorRetroman  4 роки тому +9

      Pues no es exactamente así, Victor. make_unique sí podría asimilarse a una fábrica, pues realiza la reserva y nos devuelve el puntero del tipo que solicitamos. Sin embargo, unique_ptr no se parece en nada a un Singleton. El problema es que interpretas la palabra "unique" erróneamente. Este "unique" se refiere a que sólo puede haber un Smart Pointer apuntando al objeto creado o, lo que es lo mismo, sólo puede haber un propietario. Esto no tiene nada que ver realmente con el concepto de Singleton, que sirve para asegurarse que de un tipo concreto sólo se crea una única instancia. Tanto de unique_ptr's como de los objetos a los que estos apuntan puedes crear tantas instancias como quieras. No limitan para nada en ese sentido. Como digo, el "unique" es un término de gestión de la propiedad, para garantizarse que sólo hay un responsable del recurso reservado (el unique_ptr) y que el responsable liberará el recurso al terminar el tiempo de vida.

  • @silose
    @silose 4 роки тому

    👍, Saludos

  • @Nico5Sanchez
    @Nico5Sanchez 4 роки тому +2

    Si quiero seguir la Rule of Zero, con los smart pointers, supongo, que como los unique son unicos, no se pueden utilizar, porque si lo hago miembro de una clase, y creo una instancia de esta clase, y la intento copiar, no me dejará ¿O me estoy equivocando?

    • @ProfesorRetroman
      @ProfesorRetroman  4 роки тому +3

      Creo que estás confundiendo términos. La Rule of Zero lo que dice es que siempre que puedas no definas ninguna (Zero) de las funciones miembro especiales de clase: (Constructores de copia, Asignaciones y Destructor). Como unique_ptr encapsula la reserva y liberación de un recurso usando patron RAII, si usas unique_ptr te ahorras tener que hacer eso manualmente, por lo que evitas tener que definir constructor y destructor en tu clase, y con ello tener que aplicar la Rule of Three/Five, que te diría que al haber creado alguna de las funciones miembro especiales, deberías crearlas todas.

  • @digimikeh
    @digimikeh 4 роки тому +2

    Ahora C ++ que antes