Cita:
Iniciado por xKuZz 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 originalint main(int argc, char* args[])
{
X p;
// ...
p = X(); // Ahora se asignaría un nuevo valor aleatorio a la instancia p de la clase X
// ...
return 0;
}
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#include <memory>
int main(int argc, char* args[])
{
std::unique_ptr<X> p(new X());
// ...
p.reset(new X()); // esta instrucción equivale a delete + new
// ...
// no hace falta hacer delete
return 0;
}
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 originalstruct POO
{
POO()
{ var = 1; std::cout << "POO()" << std::endl; }
~POO()
{ std::cout << "~POO()" << std::endl; }
int var;
}
int func()
{
std::unique_ptr<POO> ptr(new POO);
std::cout << ptr->var << std::endl;
// nota que aparecerá el mensaje del destructor pese a no existir ningún delete
}
int main()
{
for( int i=0; i<5; i++ )
func();
}
Un saludo.