T
Da brauchst Du keinen Destruktor, da das Kind sowieso schon in den Brunnen gefallen ist.
Diese Codesequenz:
u1 = new User(a,b,c);
liste.push_back(*u1);
u1 = new User(d,e,f);
erzeugt einen Memory-leak unabhängig davon, ob er im Konstruktor steht oder woanders.
Du erzeugst dynamisch eine Instanz der Klasse User. Den Zeiger darauf speicherst Du in einer Variablen u1. Mit diesem push_back steckst Du eine Instand der Klasse User in den Vektor, indem Du deinen Zeiger dereferenzierst. Der Compiler ruft daraufhin den Copy-Konstruktor von User auf, um eine Instanz von User zu erzeugen. Du hast also jetzt 2 Instanzen der Klasse User: einen im Vektor und einen, den du mit dem Zeiger referenzierst. Als nächstes überschreibst Du den Wert des Zeigers u1. Damit verlierst Du die Möglichkeit, deine dynamisch angelegte Instanz zu referenzieren, um sie beispielsweise mit delete frei zu geben.
Ein kleinere Unschönheit ist, daß Du die Variable u1 als Klassenvariable, statt als lokale Variable definierst.
Also besser wäre:
class A1
{
vector<User> liste;
public:
A1();
};
A1::A1(){
liste.push_back(User(a,b,c));
liste.push_back(User(d,e,f));
liste.push_back(User(g,h,i));
usw..
}
Sieht auch viel kompakter aus und es kommen keine Zeiger mehr vor.
Die Moral von der Geschichte ist, daß man Zeiger nicht verwenden sollte, wenn sie denn nicht unbedingt notwendig sind (was relativ selten der Fall ist).
Tntnet