<div dir="ltr">Hola Miguel Ángel,<div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_quote">2015-04-21 13:21 GMT-04:00 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">Gracias Steven.<div><br></div><div>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.</div><div><br></div></div></blockquote><div><br></div><div>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,</div><div><br></div><div>class Algo<br>{</div><div>  ...</div><div>  Algo( const string &str, int n );</div><div>  Algo( float f );</div><div>};</div><div>...</div><div>std :: vector<Algo> lista1;  // Error: no existe 'Algo()'</div><div>std :: vector<Algo *> lista2;<br></div><div><br></div><div>lista2.push_back( new Algo("hola",4) );</div><div>lista2.push_back( new Algo("adios",5) );<br></div><div>lista2.push_back( new Algo(-2.34f) );<br></div><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>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 ???.</div><div><br></div></div></blockquote><div><br></div><div>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.</div><div><br></div><div><br></div><div>Espero que todo esto te ayude.</div><div><br></div><div>Steven</div><div><br></div></div></div></div>