Usar punteros inteligentes en C++

Jinku Hu 12 octubre 2023
  1. Utilice std::shared_ptr para que varios punteros hagan referencia al mismo objeto en C++
  2. Utilice std::unique_ptr para que un puntero posea el objeto dado en C++
Usar punteros inteligentes 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C++ Pointer