Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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.
(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.
La biblioteca estándar de C++ proporciona varios tipos de punteros inteligentes, entre ellos:
std::unique_ptr
:
unique_ptr
Una instancia tiene propiedad exclusiva del objeto al que apunta.unique_ptr
Cuando sale del alcance o se restablece explícitamente, automáticamente llama al destructor y libera el objeto administrado.std::shared_ptr
:
shared_ptr
Las instancias comparten la propiedad del mismo objeto.shared_ptr
cantidad.shared_ptr
Cuando 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.std::weak_ptr
:
shared_ptr
problema de referencia circular.shared_ptr
objetos gestionados, pero no participa en la gestión de su ciclo de vida.shared_ptr
Cuando una instancia apunta a un objeto,weak_ptr
Puede 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.
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_ptr
Ejemplostd::unique_ptr
es un puntero inteligente con propiedad exclusiva, que garantiza que solo haya unstd::unique_ptr
Una instancia tiene control sobre un recurso determinado.cuandostd::unique_ptr
Cuando sale del alcance o se restablece, los recursos que posee se liberarán automáticamente.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个unique_ptr来管理MyClass的实例
- std::unique_ptr<MyClass> uptr(new MyClass());
-
- // 调用doSomething方法
- uptr->doSomething();
-
- // unique_ptr会在离开作用域时自动调用MyClass的析构函数
- return 0;
- }
std::shared_ptr
Ejemplostd::shared_ptr
es un puntero inteligente de propiedad compartida que permite múltiplesstd::shared_ptr
Las instancias comparten la propiedad del mismo recurso.std::shared_ptr
Utilice 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.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个shared_ptr来管理MyClass的实例
- std::shared_ptr<MyClass> sptr(new MyClass());
-
- // 创建第二个shared_ptr,共享同一个MyClass实例
- std::shared_ptr<MyClass> sptr2 = sptr;
-
- // 调用doSomething方法
- sptr->doSomething();
-
- // 当所有shared_ptr实例都超出作用域时,MyClass的析构函数才会被调用
- return 0;
- }
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_ptr
para romper el ciclo,std::weak_ptr
No incrementa el recuento de referencia, solo mantiene elstd::shared_ptr
Gestionar 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.
https://www.cnblogs.com/dios-de-la-muerte/p/17962676
https://zhuanlan.zhihu.com/p/678722914