Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Pasar Punteros Únicos | Punteros Únicos
C++ Smart Pointers
course content

Contenido del Curso

C++ Smart Pointers

C++ Smart Pointers

1. Introducción a los Punteros Inteligentes
2. Punteros Únicos
3. Punteros Compartidos
4. Punteros Débiles
5. Temas Avanzados

book
Pasar Punteros Únicos

Una de las principales razones por las que elegimos punteros y asignación de memoria dinámica sobre variables estáticas es la flexibilidad que ofrecen al pasar datos a través de diferentes secciones del código. Sin embargo, cuando se trata de punteros únicos, el paso se vuelve un poco complicado.

Al retornar desde funciones constructoras

Un caso de uso válido para pasar un puntero único es cuando se está retornando desde una función constructora (una función que existe solo para asignar/construir recursos).

cpp

unique_pointer_builder

copy
123456789101112131415
#include <iostream> #include <memory> std::unique_ptr<int> unique_ptr_builder() { return std::make_unique<int>(42); } int main() { // This will be the sole owner of the dynamically allocated integer 42 std::unique_ptr<int> p_unique = unique_ptr_builder(); if (p_unique) std::cout << "Value from unique pointer: " << *p_unique << std::endl; else std::cout << "Unique pointer is null." << std::endl; }

Usando una función constructora para crear un puntero único a un valor int. Una vez que la función devuelve, el unique_ptr en la función main comienza a apuntar al valor entero dinámico.

Al Transferir la Propiedad

También se considera válido y seguro move un puntero único. Por ejemplo, puede transferir la propiedad de un puntero único de class A a class B.

h

transferring_ownership

copy
12345
// Create a unique pointer inside classA classA->source_ptr = std::make_unique<int>(42); // Later, move the ownership to classB, this is perfectly fine classB->target_ptr = std::move(sourcePtr);

Cuándo no pasar Punteros Únicos

Compartir un std::unique_ptr con la intención de que múltiples partes lo posean no es adecuado. Esto rompe el concepto central de un puntero único, ya que debería tener solo un propietario.

Puedes crear una instancia de puntero único dentro de una clase y luego pasar su puntero crudo a una función de biblioteca externa. Tal compartición es insegura y puede llevar a problemas de memoria difíciles de depurar.

h

passing_raw_pointer

copy
12345
// Create a unique pointer. std::unique_ptr<std::string> p_unique = std::make_unique<int>(33); // Extract the raw pointer and pass it to an external class. ExternalClass obj(p_unique.get()); // Never do this, not safe.
question mark

¿Cuándo se considera apropiado pasar un puntero único?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 4
Lamentamos que algo salió mal. ¿Qué pasó?
some-alt