Ver Mensaje Individual
  #6 (permalink)  
Antiguo 18/07/2016, 01:05
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 3 meses
Puntos: 204
Respuesta: Duda con punteros

Cita:
Iniciado por xKuZz Ver Mensaje
No obstante, esa metodología a mi punto de vista parece incorrecta por dos razones:
Yo iría un poco más lejos aún.

Si no es estrictamente necesario bien por requisitos de la práctica (vamos, que te exijan hacerlo así), bien por necesidades propias de la aplicación (uso de polimorfismo, variable compartida, ...) yo te recomendaría evitar el uso de punteros en la medida de lo posible.

Evitas fugas de memoria, el programa será más rápido (las reservas de memoria son relativamente lentas), aprovecharás el principio de localidad para mejorar los tiempos de acceso a datos y el programa quedará algo más limpio:

Código C++:
Ver original
  1. int main(int argc, char* args[])
  2. {
  3.     X p;
  4.     // ...
  5.  
  6.     p = X(); // Ahora se asignaría un nuevo valor aleatorio a la instancia p de la clase X
  7.     // ...
  8.  
  9.     return 0;
  10. }

En caso de ser necesario el uso de punteros yo te sugeriría usar los punteros inteligentes. En el caso de un puntero que no vas a compartir lo ideal sería unique_ptr:

Código C++:
Ver original
  1. #include <memory>
  2.  
  3. int main(int argc, char* args[])
  4. {
  5.     std::unique_ptr<X> p(new X());
  6.     // ...
  7.  
  8.     p.reset(new X()); // esta instrucción equivale a delete + new
  9.     // ...
  10.  
  11.     // no hace falta hacer delete
  12.     return 0;
  13. }

Los punteros inteligentes no alteran la forma de acceder al objeto (se sigue usando el operador '->') y ellos solos se encargan de llamar al delete correspondiente cuando proceda:

Código C++:
Ver original
  1. struct POO
  2. {
  3.   POO()
  4.   { var = 1; std::cout << "POO()" << std::endl; }
  5.  
  6.   ~POO()
  7.   { std::cout << "~POO()" << std::endl; }
  8.  
  9.   int var;
  10. }
  11.  
  12. int func()
  13. {
  14.   std::unique_ptr<POO> ptr(new POO);
  15.   std::cout << ptr->var << std::endl;
  16.   // nota que aparecerá el mensaje del destructor pese a no existir ningún delete
  17. }
  18.  
  19. int main()
  20. {
  21.   for( int i=0; i<5; i++ )
  22.     func();
  23. }

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.