<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 dir="ltr">Hola Miguel Ángel,<div class="gmail_extra"><br><div class="gmail_quote"><div class="im">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 class="im">
<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 class="im">
<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 class="HOEnZb"><font color="#888888"><div><br></div><div>Steven</div><div><br></div></font></span></div></div></div>
<br>_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">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>