Usar punteros inteligentes en C++
-
Utilice
std::shared_ptr
para que varios punteros hagan referencia al mismo objeto en C++ -
Utilice
std::unique_ptr
para que un puntero posea el objeto dado en C++
Este artículo demostrará varios métodos de cómo usar punteros inteligentes en C++.
Utilice std::shared_ptr
para que varios punteros hagan referencia al mismo objeto en C++
Dado que la administración manual de la memoria dinámica resulta ser bastante difícil para los proyectos del mundo real y, a menudo, es la causa principal de los errores, C++ proporciona el concepto de punteros inteligentes como una biblioteca separada. Los punteros inteligentes generalmente actúan como punteros regulares y brindan características adicionales, la más destacada de las cuales es liberar automáticamente los objetos puntiagudos. Hay dos tipos principales de punteros inteligentes: shared_ptr
y unique_ptr
.
El siguiente código de ejemplo demuestra el uso del tipo shared_ptr
. Tenga en cuenta que shared_ptr
se utiliza normalmente cuando el objeto apuntado debe ser referenciado por otros apuntadores compartidos. Así, shared_ptr
tiene internamente el contador asociado, que denota el número de punteros que apuntan al mismo objeto. La función miembro shared_ptr::unique
se puede utilizar para determinar si el puntero es solo uno que hace referencia al objeto actual. El tipo de retorno de la función es booleano y el valor true
confirma la propiedad exclusiva del objeto. La función incorporada reset
reemplaza el objeto actual con el objeto pasado como primer parámetro. El objeto compartido se elimina cuando el último shared_ptr
que apunta al objeto queda fuera de alcance.
#include <iostream>
#include <memory>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main() {
std::shared_ptr<string> p(new string("Arbitrary string"));
std::shared_ptr<string> p2(p);
cout << "p : " << p << endl;
cout << "p2: " << p2 << endl;
if (!p.unique()) {
p.reset(new string(*p));
}
cout << "p : " << p << endl;
*p += " modified";
cout << "*p : " << *p << endl;
cout << "*p2 : " << *p2 << endl;
return EXIT_SUCCESS;
}
Producción :
p : 0x2272c20
p2: 0x2272c20
p : 0x2273ca0
*p : Arbitrary string modified
*p2 : Arbitrary string
Utilice std::unique_ptr
para que un puntero posea el objeto dado en C++
Alternativamente, C++ proporciona el tipo unique_ptr
que es el único propietario del objeto. Ningún otro puntero unique_ptr
puede hacer referencia a él. unique_ptr
no admite operaciones normales de copia y asignación. Aún así, la propiedad del objeto se puede transferir entre dos punteros unique_ptr
utilizando las funciones integradas: release
y reset
. La llamada a la función release
hace que el puntero unique_ptr
sea nulo. Una vez que se libera unique_ptr
, se puede llamar a la función reset
para asignarle la nueva propiedad del objeto.
#include <iostream>
#include <memory>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main() {
std::unique_ptr<string> p1(new string("Arbitrary string 2"));
std::unique_ptr<string> p3(p1.release());
cout << "*p3 : " << *p3 << endl;
cout << "p3 : " << p3 << endl;
cout << "p1 : " << p1 << endl;
std::unique_ptr<string> p4(new string("Arbitrary string 3"));
p3.reset(p4.release());
cout << "*p3 : " << *p3 << endl;
cout << "p3 : " << p3 << endl;
cout << "p4 : " << p4 << endl;
return EXIT_SUCCESS;
}
Producción :
*p3 : Arbitrary string 2
p3 : 0x7d4c20
p1 : 0
*p3 : Arbitrary string 3
p3 : 0x7d5c80
p4 : 0
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook