Du implementierst fuer Test einen Standard Ctor, aber keinen CCTor.
C++ generiert dir einen, der aber das Falsche macht(er kopiert einfach alle member), wenn du dynamsich zeugs da allokiert.
Damit erzeugst du folgendes verhalten:
du erzeugst t mittels SCTOR -> t.i wird mit new angelegt
du hausst t in den Vector, t wird mittels CCTOR kopiert, tx im Vector, tx.i zeigt auf t.i
t wird aufgeraeumt, t.i wird durch DTOR deleted
tx.i zeigt auf geloeschten speicher.
dein Vector wird demontiert
alle elemente vom vector werden vorher auch demontiert.
DTor von tx wird aufgerufen -> delete auf tx.i was ins nirvana zeigt -> schutzverletzung
teste mal mit:
Code: Alles auswählen
class Test
{
private:
int *i;
Test(const Test & rx); /// CCTOR verhindern.
public:
Test()
{
i = new int;
}
~Test()
{
delete i;
}
};
und schwupps, funktioniert deine Klasse nimmer im Container. Ergo Container nutzt CCTOR
CCTor implementieren :
Code: Alles auswählen
class Test
{
private:
int *i;
public:
Test()
{
i = new int;
}
Test(const Test & rx)
{
i = new int(*rx.i);
}
~Test()
{
delete i;
}
};
Deine Klassen hat noch ne paar Mängel, die in deinem Fall easy zu beheben sind:
- Initialisierungslisten verwenden wo geht !
- Rohe Zeiger meiden !
- Exceptionsicherheit und Speichermanagment !
Bessere Implementierung(wenn i denn unbedingt aufn freestore muss):
Code: Alles auswählen
#include <memory>
class Test
{
public:
Test():
mpIntVar(new int(0)) /// uninitialisierte Variablen sind doof, beleg sie mit 0
{
}
Test(const Test & rx):
mpIntVar(new int(*rx.mpIntvar.get()))
{
}
~Test() /// das delete geht durch den autoptr allein
{
}
private:
const std::auto_ptr<int> mpIntVar;
};
Ciao ....