problem mit copy-konstruktoren



  • hallo,
    habe mich durchs forum geklickt und auch im netz sachen gelesen ueber copy-konstruktoren aber ich verstehe nicht wann man einen brauch und wann nicht:

    Die Daumenregel (wie ich sie verstanden habe) ist doch:
    "Solange ich nichts mit speichermanagement am hut habe, brauche ich auch keinen copy-konstruktor und kann den default kopy-konstruktor benutzen, der member-weise (und da auch evtl. mit copy-konstruktoren) kopiert)"
    (ist das richtig !?)

    1. ein beispiel:
    class AVec : public vector<A>
    {
      public:
       void pop(unsigned index, AVec &dst)
       {
         if(index > size()-1) return;
         dst.push_back(*(begin()+index));
         erase(begin()+index);
       }
    };
    

    wobei die Klasse A wie folgt deklariert ist:

    class A
    {
      public:
       A(int x=0, int y=0):m_x(x),m_y(y){}
       ~A(){}
    
      private:
       int m_x;
       int m_y;
    };
    

    nun habe ich zwei Objekte:

    AVec obj1, obj2;
    

    und eine programmstelle, an der nun steht:

    while(!obj1.empty())           // alles was in obj1 ist in obj2 reinschuetten
       obj1.pop(0, obj2);
    

    und an genau dieser Stelle kackt mein programm ab 😮 .
    mit dem debugger kann ich sehen, dass er in der methode pop undzwar an der folgenden stelle abschmiert:

    ...
    dst.push_back(*(begin()+index));
    ...
    

    ich vermute da klappt was mit den copy-konstruktoren nicht ganz wie es soll.
    aber ich weiss jedoch nicht was genau 😕 .

    ich danke vorab vielmals.
    gruss



  • "Kackt ab" und "schmiert ab" sind keine ausreichenden Fehlerbeschreibungen. Was genau passiert? Kannst du ein Minimalbeispiel schreiben, das den Fehler reproduziert?



  • also nochmal ohne "fekaliensprache":

    es kommt eine meldung ueber eine unbehandelte ausnahme. ferner steht in diesem fenster "zugriffsverletzung-leseposition 0x00000000."

    diese meldung bekomme ich sobald die folgende zeile ausfuehre

    dst.push_back(*(begin()+index));
    

    gruss



  • Also deine Klasse A braucht keinen selbstdefinierten Kopierkonstruktor, daran kann es also nicht liegen.



  • koennt ihr mir vielleicht sagen, ob die besagte zeile:

    dst.push_back(*(begin()+index));
    erase(begin()+index);
    

    soweit ok aussieht!?!?

    sinn ist es ein bestimmtes element an index'ter stelle eines stl-vectors
    auf einen anderen vektor zu pushen und diesen dann anschliessen aus dem ersten vektor zu entfernen. aber wie gesagt, zum entfernen komme ich ja garnicht mehr wegen der unbehandelten ausnahme beim pushen.

    vielen dank.
    gruss



  • vorab tschuldigung wegen der muehe,

    habe fehler selber gefunden.

    vielen dank.

    (manchmal lohnt es sich ein problem nur zu schildern, um auf die loesung dessen zu kommen :)))

    guten rutsch :xmas2:


Anmelden zum Antworten