Deep Copy & vector

  • Hallo Leute..

    Ich habe folgedes Problem: Habe eine variable 'vector<MyType*> my_vars_'. 'MyType' ist eine Klasse und sieht in etwa so aus:

    Code
    class MyType
    {
    protected:
      char *blabla_;
      MyOtherType *other_type_; // !!!!!!!
      vector<MyType*> types_; // !!!!!!!
    ...
    };


    Nun moechte ich 'my_vars_' kopieren und zwar eine wirkliche Kopie machen. D.h. ich will, dass die beiden vectors (also die Kopie und die Quelle) nicht auf einander zeigen. Leider erreiche ich ja hier mit dem Copy Constructor von 'vector' nur ein Kopieren der 'MyType'-Pointer, aber kein Kopieren der anderen Objekte..

    Meine Frage nun: Wisst ihr eine Moeglichkeit, wie man einen Vector mit allen Zeigern und Objekten kopiert (also wirklich alles), ohne dass ich fuer die Objekte manuell wieder Speicher allokieren muss?

    Dank im Voraus..
    bye..

  • Zitat von \LaTeX

    Meine Frage nun: Wisst ihr eine Moeglichkeit, wie man einen Vector mit allen Zeigern und Objekten kopiert (also wirklich alles), ohne dass ich fuer die Objekte manuell wieder Speicher allokieren muss?

    IMHO willst du das:

    Verwende statt eines char* einen std::string und bau in MyType einen copyconstructor ein, der MyOtherType kopiert ala:

    Code
    MyType::MyType (MyType &M) :
         blabla_ (M.blabla_),
         other_type_ (new MyOtherType (*M.other_type_)),
         types_ (M.types_)
      {
      }
  • Danke nochmals.. hat funktioniert..

    Haette da noch eine Verstaendnisfrage: Ich hab nun, da ich eine vector von Pointern auf 'MyType' verwende, den gesamten vector folgend kopiert:


    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:


    Meine Frage: Habe ich nun den angeforderten Speicher wieder oder was mache ich falsch?

    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?

    Dank im Voraus..
    ciao..

  • 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:


    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:


    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 ;-).

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!