<div dir="ltr"><div><div>Buenos días Steven.<br><br></div>Más o menos entiendo la idea. Lo que me cuesta ahora es saberlo aplicar en la práctica.<br><br></div><div>Y me doy cuenta de que lo que me falta es la base.<br><br>

</div><div>No tengo claro cuándo debo definir atributos ( miembros de una clase ) como punteros a objetos ( en este caso con Shared_Ptr ) o como variables de objetos.<br><br></div><div>Si los atributos son definidos como variables de objetos, aunque no lo haga yo explicitamente, la clase los crea en el constructor, no ???<br>
<br></div><div>Y si son definidos como punteros, entonces puedo crearlos yo cuando y donde quiera, no ???<br><br></div><div>Y no entendí esto :<br><br><div><span style="color:rgb(61,133,198)">Siempre nos interesa construir el puntero compartido; así que haz esto:<br>
<br>shared_ptr<int> sp = new int;</span></div><div><br></div><div>¿ Con tipos básicos como int también se debe de usar Shared_Ptr ???, es decir, usar punteros ???.<br></div><div>Porque yo estoy usando constantemente variables de tipo int como atributos de las diferentes clases que creo. Es decir, no los creo con "new".<br>
<br></div><div>Y supongo que en tal caso sería así, no ???<br><span style="color:rgb(61,133,198)">shared_ptr<int> sp = <shared_ptr>( new int);</span><br><br></div><div>En fin, Steven, no te preocupes mucho, supongo que necesito tiempo para irme aclarando con todo esto.<br>
<br></div><div>Saludos !!!<br></div><br></div><div><font color="#3d85c6" face="verdana, sans-serif"></font></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">El 29 de diciembre de 2013, 19:20, Miguel Ángel Torres Fernández-Píñar <span dir="ltr"><<a href="mailto:miguelangeltorresfp@gmail.com" target="_blank">miguelangeltorresfp@gmail.com</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div>Muchas gracias Steven.<br><br></div>Voy a tratar de asimilarlo con calma.<br><br></div>Como siempre una gran explicación.<br>
<br></div>Muchísimas gracias una vez más por tu dedicarnos tu valioso tiempo.<br>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">El 29 de diciembre de 2013, 18:30, Davidson, Steven <span dir="ltr"><<a href="mailto:srd4121@njit.edu" target="_blank">srd4121@njit.edu</a>></span> escribió:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5"><div dir="ltr">Hola Miguel Ángel,<div class="gmail_extra"><br><div class="gmail_quote"><div>2013/12/29 Miguel Ángel Torres Fernández-Píñar <span dir="ltr"><<a href="mailto:miguelangeltorresfp@gmail.com" target="_blank">miguelangeltorresfp@gmail.com</a>></span><br>


<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><div><div>Buenos días a todos.<br><br>


</div>Me han recomendado usar mejor punteros inteligentes ( Shared_Ptr ) para miembros de una clase, para evitar memory leaks, sobre todo en casos en el que tenga que cargar imágenes, textos, etc..<br>
<br></div><div>Me dicen además que de esta forma puedo crear estos objetos en el momento en el que me convenga. Que no se tienen que crear cuando instancio un objeto de la clase.<br></div><div><br></div>Me comentan que debo evitar crear objetos con el operador "new".<br>



<br></div><div>Pero sigo sin tener todo esto muy claro.<br><br></div></div></blockquote><div><br></div></div><div>La idea es reducir la posibilidad de cometer errores durante la programación. El problema de usar memoria dinámicamente adjudicada es que tienes que liberarla. Si uno no tiene cuidado, o simplemente no tiene control acerca del momento de perder esa dirección de memoria, entonces perdemos la oportunidad de liberar esa memoria. A esto lo llamamos "fuga de memoria" (o en inglés, memory leak).</div>


<div><br></div><div>Existen varias clases-plantilla, que principalmente son: 'shared_ptr', 'unique_ptr' (previamente, 'auto_ptr'), y 'weak_ptr' que sirven para representar punteros agregando algún "grado" de seguridad. Con esto, podemos crear un sistema de gestión de memoria que posiblemente tenga una "recogida de basura" (en inglés, garbage collection), que alivia el problema y peligro de las fugas de memoria, automatizando la liberación de memoria previamente adjudicada dinámicamente. Por ello, a estas clases-plantilla se llaman "punteros inteligentes".</div>


<div><br></div><div>El caso de 'shared_ptr' sirve para compartir una misma dirección de memoria dinámicamente adjudicada entre varios objetos. Eso sí, la liberación de tal memoria recae en cada objeto; típicamente, el destructor por defecto liberará la memoria, pero sólo cuando sea el último y no comparta con otros objetos. Dicho esto, 'shared_ptr' actúa más como el patrón de la fábrica, compartiendo la misma dirección de memoria, pero tomando nota de la cuenta de objetos que la comparten. Cuando la cuenta sea 0 (cero), y por tanto no haya dueños de tal dirección de memoria, entonces se libera tal memoria.</div>

<div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div></div><div>Por ejemplo, si tengo un miembro de tipo "string", ¿ debería  de usar "Shared_Ptr<string>" ???<br>


<br></div></div></blockquote><div><br></div></div><div>No, porque el miembro es un objeto de la clase 'string', no un puntero a 'string'. Si tuvieras esto:<br><br>class Nombre<br>{<br>private:<br>  string *pNombre;</div>


<div><br></div><div>  Nombre( const string &nom )<br>  {</div><div>    pNombre = new string( nom );<br>  }</div><div>  ~Nombre()  { delete pNombre; }</div><div>};</div><div><br></div><div>Entonces sí podrías usar 'shared_ptr<string>'; esto es,</div>


<div><br></div><div><div>class Nombre<br>{<br>private:<br>  shared_ptr<string> spNombre;</div><div><br></div><div>  Nombre( const string &nom )<br>  {</div><div>    spNombre = make_shared<string>( new string( nom ) );<br>


  }</div><div>};<br></div></div><div><br></div><div>Siempre nos interesa construir el puntero compartido; así que haz esto:<br><br>shared_ptr<int> sp = new int;</div><div><br></div><div>Si no, entonces usa 'make_shared' para seguir esta práctica.</div>

<div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div></div><div>Y en el caso de un vector de objetos de tipo "X", o de un vector " que contiene otro vector de objetos de tipo "X" ?<br>



<br></div></div></blockquote><div><br></div></div><div>Es el mismo ejemplo anterior, si no escribes objetos dinámicamente adjudicados, entonces no necesitas punteros y por tanto no necesitas punteros inteligentes. Ciertamente, la clase-plantilla 'vector' sí usa memoria dinámica, pero eso no es tu problema, sino el de 'vector'. Por ejemplo,</div>


<div><br></div><div>vector< vector<int> > vvi;</div><div><br></div><div>vvi.push_back( vector<int>(100) );  // Crea un vector que reserva 100 enteros y agrégalo a 'vvi'.</div><div><br></div><div>


Ahora bien, si se trata de un vector de vectores dinámicos, entonces sí usaríamos un puntero inteligente; por ejemplo,</div><div><br></div><div><div>vector< unique_ptr< vector<int> > > vpvi;</div></div>

<div>
<br></div><div><br></div><div>Espero que esto te aclare las dudas.</div><span><font color="#888888"><div><br></div><div>Steven</div><div><br></div></font></span></div></div></div>
<br></div></div>_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br></blockquote></div><br></div>
</blockquote></div><br></div>