Probleme mit Pointerübergabe und Heap Speicher



  • Warum erzeugst du überhaupt eine Kopie von this?



  • Hab ich mir schon gedacht, dass irgendwas mit der Speicherverwaltung nicht funktioniert, da mein Programm auch häufig absürzt.

    Werde denke in den sauren Apfel beißen müssen und mir die Klasse mit std::vectoren neu schreiben müssen.

    Die Kopie von this habe ich mir erstellt, da ich mit einer neuen Matrix handlicher arbeiten kann.

    Danke für eure Hilfe

    Gruß

    Alex



  • AlexR schrieb:

    Die Kopie von this habe ich mir erstellt, da ich mit einer neuen Matrix handlicher arbeiten kann.

    Ja dann ...
    Bei Matrizenrechnung kommt es ja auf Performance nicht an ...



  • Mit einem std::vector brauchst du zusätzlich auch keine Kopieroperatoren implementieren, was du jetzt auch nicht hast, deswegen die Laufzeitfehler, das macht der std::vector selbst. Auch kannst du dir überlegen, ob du nicht lieber auf statische Arrays mit zur Kompilierzeit bekannten Größen setzt, schließlich ändert so eine Matrix selten ihre Größe während der Laufzeit.



  • Kopie, um handlicher zu arbeiten?! Und das bei einer Ausgabefunktion? Das erschließt sich mir nicht.

    Und dein erster Konstuktor, der rows=0, cols=0 setzt, der macht dann ein new double[0] , gibt dir also einen Pointer, den du nicht sinnvoll nutzen kannst.

    Also ersetze pArray doch einfach durch einen vector<double> daten . Dein 2. Konstruktor wird auch einfacher:

    Matrix(int _rows, int _columns)
        : rows(_rows)
        , cols(_columns)
        , daten(_rows * _cols)
    {}
    

    Dein Destruktor fällt komplett weg und dein operator[] kann praktisch gleich bleiben, wo ist also der saure Apfel, in den du beißen musst?

    (Es gibt natürlich schon haufenweise Bibliotheken für Matrix-Multiplikation, ich nehme also an, du machst das zum Lernen?)



  • Hallo,

    danke für eure Antworten. Hab das Array jetzt durch einen std::vector ersetzt.
    Funktioniert soweit erstmal.

    Ein Problem habe ich aber noch, da es anscheinend sehr verpönt ist eine Kopie von *this zu erzeugen.

    Wenn ich die Kopie nicht mache, wie kann ich denn dann auf die einzelnen Elemente meiner Instanz zugreifen?

    wenn ich versuche über this[i][j] die daten zu bekommen, ist meine Ausgabe auf die Konsole total falsch.
    Benutze ich jedoch die Kopie von this stimmt meine Ausgabe mit Get().

    Was kann ich also machen um per Get() die richtigen Ausgaben zu bekommen?

    Meine Motivation hinter dem ganzen ist mehr C++ zu lernen.
    Finde es irgendwie cool was eigenes zu erschaffen, auch wenn es effizienter wäre auf eine fertige Bibliothek zuzugreifen.

    Danke und Gruß



  • AlexR schrieb:

    Ein Problem habe ich aber noch, da es anscheinend sehr verpönt ist eine Kopie von *this zu erzeugen.

    Nicht verpönt, hier aber total unnötig - es gibt einfach keinen Grund dazu.

    AlexR schrieb:

    Wenn ich die Kopie nicht mache, wie kann ich denn dann auf die einzelnen Elemente meiner Instanz zugreifen?

    wenn ich versuche über this[i][j] die daten zu bekommen, ist meine Ausgabe auf die Konsole total falsch.

    Entweder operierst du direkt auf dem entsprechenden Member (in deinem Code pArray ) oder greifst mit (*this)[i][j] darauf zu. Mit (*this) dereferenzierst du den Zeiger auf das eigene Objekt und erhältst eine Referenz.



  • AlexR schrieb:

    wenn ich versuche über this[i][j] die daten zu bekommen,

    (*this)[i][j]
    const Matrix& m1 = *this
    Matrix operator +(const Matrix &m2, const Matrix &m2)



  • AlexR schrieb:

    Ein Problem habe ich aber noch, da es anscheinend sehr verpönt ist eine Kopie von *this zu erzeugen.

    Ich mach mal einen Autovergleich (etwas weit hergeholt, aber vielleicht gar nicht so schlecht):

    Angenommen, du möchtest ein Auto probefahren (= Matrix ausgeben). Dann suchst du dir einen Mechaniker, der das Auto komplett nachbaut (=kopiert), dann machst du eine Probefahrt in dem nachgebauten Auto (=ausgeben der Matrix) und schließlich verschrottest du das nachgebaute Auto wieder (=Destruktor der Kopie). Klingt das für dich nicht auch sehr aufwendig?

    Wäre es nicht einfacher, direkt das Auto probezufahren (=Ausgeben der Matrix ohne Kopie)?

    Also merke: keine unnützen Kopien!



  • Danke für eure Tips,
    ich habe mich so auf den this zeiger versteift, dass ich vergessen habe innerhalb der Instanz einfach auf das Array direkt zuzugreifen. 🙄

    Das kopieren ist natürlich unsinnig, ich sehe es ein.

    Danke für eure Hilfe.


Anmelden zum Antworten