[C con Clase] Pregunta sencilla de creo rápida respuesta.

Miguel Ángel Torres Fernández-Píñar miguelangeltorresfp en gmail.com
Mie Abr 22 09:18:02 CEST 2015


Muchas gracias Steven como siempre.

Poco a poco me voy aclarando.

Quizás me falte ver ahora en qué casos pudiera ser contraproducente usar
punteros inteligentes, porque de momento parece que todo son ventajas.

Saludos.

El 21 de abril de 2015, 22:10, Davidson, Steven <srd4121 en njit.edu> escribió:

> Hola Miguel Ángel,
>
> 2015-04-21 13:21 GMT-04:00 Miguel Ángel Torres Fernández-Píñar <
> miguelangeltorresfp en gmail.com>:
>
>> Gracias Steven.
>>
>> Más o menos me voy aclarando con punteros a un solo objeto, pero no lo
>> tengo tan claro cuando se trata de una colección de objetos. Cuando por
>> ejemplo hacemos uso de la clase vector de la librería estándar. En ese caso
>> no tengo muy claro en qué casos es conveniente meter los objetos en el
>> vector como referencias o como punteros inteligentes a dichos objetos.
>>
>>
> Se trata más bien de las necesidades del diseño. Si guardas objetos,
> entonces 'vector' instanciará varios de ellos. Al no tener control sobre la
> instanciación, ni por tanto de la construcción, debemos asegurar que la
> clase del objeto pueda construirse sin parámetros. Si esto es un problema,
> entonces es mejor usar un vector de punteros para ir instanciando cada uno,
> con su construcción apropiada; es decir, con los parámetros necesarios. Por
> ejemplo,
>
> class Algo
> {
>   ...
>   Algo( const string &str, int n );
>   Algo( float f );
> };
> ...
> std :: vector<Algo> lista1;  // Error: no existe 'Algo()'
> std :: vector<Algo *> lista2;
>
> lista2.push_back( new Algo("hola",4) );
> lista2.push_back( new Algo("adios",5) );
> lista2.push_back( new Algo(-2.34f) );
> ...
>
> Porque un objeto de tipo vector se encarga de destruir los objetos que
>> contiene. En ese caso si son punteros normales, qué hace, los destruye sin
>> más, o hace un delete de los punteros ???.
>>
>>
> No; 'vector' elimina la memoria relacionada con los objetos del tipo
> indicado. No sabe absolutamente nada acerca de los punteros que guardes. Si
> necesitas eliminar memoria dinámicamente, entonces el responsable eres tú.
> He aquí la necesidad de usar punteros inteligentes. Al ser objetos de una
> clase, sus destructores son invocados implícitamente, y en el caso de
> punteros inteligentes, esto supone eliminar implícitamente el objeto
> apuntado. Como dije antes, esta gestión se automatiza, y no hace falta ser
> explícito.
>
>
> Espero que todo esto te ayude.
>
> Steven
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150422/a8e75893/attachment.html>


Más información sobre la lista de distribución Cconclase