1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Deep Copy & vector

  • \LaTeX
  • 5. Juni 2004 um 13:58
  • Unerledigt
  • \LaTeX
    7
    \LaTeX
    Mitglied
    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
    8
    djmaecki
    Mitglied
    Reaktionen
    1
    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
    7
    \LaTeX
    Mitglied
    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
    8
    djmaecki
    Mitglied
    Reaktionen
    1
    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
    11
    Ringding
    Mitglied
    Reaktionen
    12
    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.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung