Zitat von \LaTeX
Haette da noch eine Verstaendnisfrage: Ich hab nun, da ich eine vector von Pointern auf 'MyType' verwende, den gesamten vector folgend kopiert:
MyType(MyType *copied_type)
id_(copied_type->getID()) // type: unsigned int
...
{
}
...
vector<MyType*>::iterator iter_old = types_.begin();
while (iter_old != types_.end())
{
types_copy_.push_back(new MyType(*iter_old)); // !!!
++iter_old;
}
...
};
Alles anzeigen
Prinzipiell passt das.
Zitat von \LaTeX
Wie muss ich dann die angelegte Memory wieder freigeben? Meine, sobald der vector-Destruktor aufgerufen wird, verliere ich die Base-Pointer und auch den angeforderten Speicher.. Hab' deshalb fuer den Destruktor der Klasse folgendes:
class MyGreatObject
{
vector<MyType*> types_copy_;
...
virtual ~MyGreatObject()
{
vector<MyType*>::iterator iter = types_copy_.begin();
while (iter != types_copy_.end())
{
delete (*iter);
}
}
Alles anzeigen
Meine Frage: Habe ich nun den angeforderten Speicher wieder oder was mache ich falsch?
Stimmt. Du würdest dir aber einige Arbeit mit Speicherfreigeben im dtor ersparen, wenn du die Pointer von einem smart_ptr (http://www.boost.org/libs/smart_ptr/smart_ptr.htm) managen lassen würdest. zB: std::vector< boost::shared_ptr<MyType *> >
Zitat von \LaTeX
PS: Haette noch folgendes gerne gewuszt: Wie kann ich in VC7 feststellen, dass ich ein Memory Leak hab? Gibt's einfache Tools dafuer, wenn ja welche sind empfehlenswert?
Hm, keine Ahnung, wie das unter Win geht. Bin eigentlich ein g++-man ;-). Eine naive Methode wäre ein geschwindes Testproggie zu schreiben, dass dauernd MyTest instanziert, mit irgendwas befüllt, und dann wieder destruktiert und nebenbei den vorhandenen Memory monitoren. Wenn immer weniger Speicher bleibt, hats was ;-).