1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Deep Copy & vector

  • \LaTeX
  • 5. Juni 2004 um 13:58
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • \LaTeX
    Punkte
    425
    Beiträge
    66
    • 5. Juni 2004 um 13:58
    • #1

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

  • djmaecki
    Punkte
    616
    Beiträge
    119
    • 5. Juni 2004 um 14:36
    • #2
    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_)
      {
      }
  • \LaTeX
    Punkte
    425
    Beiträge
    66
    • 7. Juni 2004 um 00:28
    • #3

    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:

    Code
    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


    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:

    Code
    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?

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

  • djmaecki
    Punkte
    616
    Beiträge
    119
    • 8. Juni 2004 um 09:21
    • #4
    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:

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

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

  • Ringding
    Punkte
    1.237
    Beiträge
    244
    • 9. Juni 2004 um 20:27
    • #5

    Schau dir die Doku zu _CrtDumpMemoryLeaks an. In wizard-generierten MFC Programmen wird das im Debug-Build eh automatisch verwendet.

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum