Compartir tecnología

【C】Puntero inteligente

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Punteros inteligentes explicados

Smart Pointer es una herramienta en C++ que se utiliza para administrar automáticamente la memoria asignada dinámicamente.

Es una clase que encapsula las funciones de los punteros sin formato y puede manejar automáticamente la asignación y liberación de recursos, ayudando así a los programadores a evitar errores comunes de administración de memoria, como pérdidas de memoria, punteros colgantes y otros problemas.

Los punteros inteligentes funcionan a través del mecanismo La adquisición de recursos es inicialización (RAII), lo que significa que los punteros inteligentes adquieren recursos cuando se construyen y liberan recursos cuando se destruyen. Esto garantiza que los recursos se liberen correctamente incluso en circunstancias anormales.

 

Problemas resueltos por punteros inteligentes

(1) Pérdida de memoria: la memoria se libera manualmente, pero se puede liberar automáticamente mediante punteros inteligentes.

(2) Propagación y liberación de punteros de propiedad compartida, como problemas de destrucción cuando varios subprocesos utilizan el mismo objeto.

 

Varios tipos de punteros inteligentes

La biblioteca estándar de C++ proporciona varios tipos de punteros inteligentes, entre ellos:

  1. std::unique_ptr

    • modelo de propiedad exclusiva, es decir,unique_ptrUna instancia tiene propiedad exclusiva del objeto al que apunta.
    • cuandounique_ptrCuando sale del alcance o se restablece explícitamente, automáticamente llama al destructor y libera el objeto administrado.
    • No se admite la copia, pero es posible moverla.
  2. std::shared_ptr

    • Modelo de propiedad compartida, que permite múltiplesshared_ptrLas instancias comparten la propiedad del mismo objeto.
    • Utilice el recuento de referencias para realizar un seguimiento de las referencias al mismo objetoshared_ptrcantidad.
    • cuando el ultimoshared_ptrCuando una instancia sale del alcance o se restablece, el recuento de referencias se reduce a cero, se llama al destructor del objeto y se libera el objeto.
  3. std::weak_ptr

    • usado para resolvershared_ptrproblema de referencia circular.
    • Sin incrementar el recuento de referencia, se puede observar medianteshared_ptrobjetos gestionados, pero no participa en la gestión de su ciclo de vida.
    • cuando no hayshared_ptrCuando una instancia apunta a un objeto,weak_ptrPuede detectar que el objeto ha sido destruido.

El diseño y uso de punteros inteligentes simplifica enormemente la gestión de la memoria en C++ y mejora la solidez y seguridad del programa. En la programación moderna en C++, se recomienda encarecidamente utilizar punteros inteligentes en lugar de punteros sin formato para mejorar la calidad y la capacidad de mantenimiento del código.

 

Ejemplo de puntero inteligente

Los punteros inteligentes se utilizan en C++ como un medio para administrar automáticamente la memoria asignada dinámicamente para evitar pérdidas de memoria y otros problemas relacionados con la administración de recursos.

std::unique_ptrEjemplo

std::unique_ptres un puntero inteligente con propiedad exclusiva, que garantiza que solo haya unstd::unique_ptr Una instancia tiene control sobre un recurso determinado.cuandostd::unique_ptrCuando sale del alcance o se restablece, los recursos que posee se liberarán automáticamente.

  1. #include <memory>
  2. class MyClass {
  3. public:
  4. MyClass() { std::cout << "MyClass constructor called.n"; }
  5. ~MyClass() { std::cout << "MyClass destructor called.n"; }
  6. void doSomething() { std::cout << "Doing something...n"; }
  7. };
  8. int main() {
  9. // 创建一个unique_ptr来管理MyClass的实例
  10. std::unique_ptr<MyClass> uptr(new MyClass());
  11. // 调用doSomething方法
  12. uptr->doSomething();
  13. // unique_ptr会在离开作用域时自动调用MyClass的析构函数
  14. return 0;
  15. }

std::shared_ptrEjemplo

std::shared_ptres un puntero inteligente de propiedad compartida que permite múltiplesstd::shared_ptrLas instancias comparten la propiedad del mismo recurso.std::shared_ptrUtilice un recuento de referencia para realizar un seguimiento de cuántos punteros inteligentes apuntan al mismo recurso. Cuando el recuento de referencia llega a 0, el recurso se libera.

  1. #include <memory>
  2. class MyClass {
  3. public:
  4. MyClass() { std::cout << "MyClass constructor called.n"; }
  5. ~MyClass() { std::cout << "MyClass destructor called.n"; }
  6. void doSomething() { std::cout << "Doing something...n"; }
  7. };
  8. int main() {
  9. // 创建一个shared_ptr来管理MyClass的实例
  10. std::shared_ptr<MyClass> sptr(new MyClass());
  11. // 创建第二个shared_ptr,共享同一个MyClass实例
  12. std::shared_ptr<MyClass> sptr2 = sptr;
  13. // 调用doSomething方法
  14. sptr->doSomething();
  15. // 当所有shared_ptr实例都超出作用域时,MyClass的析构函数才会被调用
  16. return 0;
  17. }

 

Precauciones

En usostd::shared_ptr Al hacer esto, tenga cuidado de evitar situaciones de referencia circular, lo que hará que el recuento de referencias nunca baje a 0, lo que provocará fugas de recursos.En el caso de referencias circulares, se puede utilizarstd::weak_ptrpara romper el ciclo,std::weak_ptrNo incrementa el recuento de referencia, solo mantiene elstd::shared_ptrGestionar referencias débiles a recursos.

Estos ejemplos muestran cómo utilizar punteros inteligentes para administrar la memoria asignada dinámicamente para garantizar que los recursos se liberen correctamente en el momento adecuado, evitando errores comunes que pueden ocurrir al administrar la memoria manualmente.

 

Otros ejemplos

https://www.cnblogs.com/dios-de-la-muerte/p/17962676

https://zhuanlan.zhihu.com/p/678722914