2011-02-15 13 views
7

Hoy se le preguntó sobre los punteros inteligentes en C++, y no puedo encontrar información útil en cualquier lugar sobre esto ..¿Alguien puede explicar los indicadores inteligentes en inglés sencillo?

Por favor, alguien puede decir: ¿Qué es punteros inteligentes? ¿Cuándo lo necesitas? ¿Tiene algún ejemplo donde los punteros inteligentes realmente son útiles?

Gracias!

+0

¿Como en boost smart puninters? http://www.boost.org/doc/libs/1_45_0/libs/smart_ptr/smart_ptr.htm – mkb

+0

Espero que podamos asumir el conocimiento y la comprensión de los punteros "regulares"? – delnan

+0

delnan, sí :) ___ – VextoR

Respuesta

6

Principalmente, punteros inteligentes que ayudan a:

  • evitar fugas cuando se producen excepciones. Cuando se lanza una excepción, no desea que se filtren los objetos asignados anteriormente en el bloque try. Envolviéndolos en punteros inteligentes, que se destruirán cuando se salga del bloque try, esos objetos se destruirán adecuadamente.
  • Administre el tiempo de vida de los propietarios de recuento de referencias a los objetos (es decir, el último en destruir su puntero inteligente haciendo referencia a un objeto en particular desasigna el objeto). Esto es especialmente útil en escenarios débilmente acoplados en los que no está claro en qué momento debe destruirse el objeto, ya que los usuarios del objeto no se conocen entre sí.

Un buen ejemplo de punteros inteligentes son útiles:

Un vector de punteros a objetos. Por por lo que es un vector de punteros compartidos, por ejemplo, los objetos serán desasignarse automáticamente cuando se destruya el vector y/o se eliminen los objetos . Esto automatiza la administración de la duración de los objetos y ayuda al usuario del contenedor a evitar fugas de memoria.

+0

gracias, ¿pueden explicar más sobre el uso de punteros inteligentes para excepciones? ¿Cómo se puede usar en esa situación? – VextoR

+0

Tenga en cuenta que existen técnicas distintas del recuento de referencias, como vincular punteros inteligentes en una lista doblemente vinculada. Aunque no es demasiado práctico. –

+0

@VextoR, se agregaron más detalles sobre cómo ayudan con el manejo de excepciones –

0

Un puntero inteligente es un objeto que asigna dinámicamente la memoria para lo que apunta, y cuando el puntero inteligente se sale del alcance, automáticamente desasigna la memoria para lo que apunta. Es útil cuando quieres algo que está desasignado cuando se sale del alcance, pero es demasiado grande para ponerlo en la pila (o tiene otros problemas que impiden que se pueda colocar en la pila).

+0

No estoy seguro de que el puntero inteligente sea necesariamente responsable de asignar la memoria. – Nick

+0

Eso es verdad. Además, hay punteros inteligentes de recuento de referencia que pueden no desasignar necesariamente la memoria hasta que el recuento de referencia sea cero. – Reinderien

0

Un puntero inteligente esencialmente administra la memoria asignada en el montón con un objeto asignado en la pila.

Dado que los objetos asignados en la pila tienen una vida útil fija (es decir, dentro del alcance que se declaran) la desasignación de la memoria del montón es determinista y está garantizada que suceda.

+2

Es concebible tener un puntero inteligente asignado en el montón a un objeto en la pila. –

+0

@Maxim ¡es muy cierto! – Nick

3

Extracto de lib Boost punteros inteligentes (smart_ptr):

punteros inteligentes son objetos que almacenan punteros a asignado dinámicamente objetos (montón). Se comportan de forma muy similar a punteros incorporados en C++, excepto que eliminan automáticamente el objeto señalado en el momento apropiado. Los punteros inteligentes son particularmente útiles a pesar de las excepciones ya que aseguran la destrucción adecuada de los objetos asignados dinámicamente. Ellos también se pueden utilizar para realizar un seguimiento de objetos dinámicamente asignados compartidos por varios propietarios.

Conceptualmente, punteros inteligentes son vistos como poseer el objeto apuntado, y por lo tanto responsable de la eliminación del objeto cuando ya no se necesita.

1

Los punteros inteligentes manejan su propia gestión de memoria al realizar un seguimiento de cuántas referencias apuntan a la memoria. Una vez que haya 0 referencias, borrará la memoria por usted. Facilita la administración de la memoria.

1

puntero inteligente general se refiere a una clase que se comporta como un puntero. Puede usar la clase para almacenar un puntero a la memoria que asigna y acceder a los datos a través del puntero.

La ventaja es que, cuando se utiliza dentro de funciones y métodos, el puntero inteligente se puede hacer para desasignar automáticamente la memoria una vez que la variable se sale del alcance. De lo contrario, esta es una excelente oportunidad para una pérdida de memoria cuando las funciones no liberan toda la memoria asignada.

Por ejemplo, echa un vistazo a http://msdn.microsoft.com/en-us/library/txda4x5t(VS.80).aspx.

0

Los punteros inteligentes son básicamente objetos que realizan funciones similares a los punteros que se utilizan para disminuir la asignación y el tiempo de desasignación. Para C++, un ejemplo común sería auto_ptr

Cuestiones relacionadas