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

Löschen eines multidimensinal arrays.

  • baracuda
  • 24. September 2011 um 14:53
  • Unerledigt
  • baracuda
    7
    baracuda
    Mitglied
    Punkte
    410
    Beiträge
    51
    • 24. September 2011 um 14:53
    • #1

    Hallo,

    Die IDE ist Microsoft Visual C++ 2010 Express.

    Ich habe eine Klasse, welche über ein 2 dimensionales array verfügt:

    double matrix_ [COLOM] [ROW];

    Wenn ich versuche das array zu löschen bekomme ich jedoch immer wieder Laufzeitfehler. COLOM und ROW sind immer 2 btw.

    Versuch 1:
    delete (double *) matrix_[0];
    delete (double *) matrix_[1];
    delete matrix_;

    Versuch 2:
    delete [] matrix_[0]; // Wirft compiler Warning warning C4154: Löschen eines Arrayausdrucks; Konvertierung in Zeiger
    // warning C4156: Löschen eines Arrayausdrucks ohne Verwendung der Arrayform von 'delete'. Arrayform wird automatisch verwendet.
    delete [] matrix_[1];
    delete matrix_;

    Versuch 3:
    delete (double *) [] matrix_[0];
    delete (double *) [] matrix_[1];
    delete matrix_;

    So einen Runtimefehler bekomme ich:

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Ich habe auch die Zeile "delete matrix_;" weggelassen und die verschiedenen Methoden probiert. Versuch 2 sollte laut diversen Foren eignelich funktionieren.

    Anbei die Klasse:

    Code
    #include <iostream>
    #define    COLOM    2
    #define    ROW        2
    
    
    using namespace std;
    
    
    class Matrix
    {
    public:
        Matrix( double (*matrix)[ROW]);
        Matrix (const Matrix& m);
        ~Matrix ();
        double    det(void);
        bool    isSingular(void);
        void print(void);
    private:
        double matrix_ [COLOM] [ROW];
        int    matrixSize_;
    };
    
    
    Matrix::~Matrix()  
    {     
        cout << "\nDestructor: " << matrix_ << "\n"; 
        //delete [] matrix_;
        delete [](double *) matrix_[0];
        delete [](double *) matrix_[1];
        //delete    matrix_;
        //delete [] matrix_;
    };
    
    
    Matrix::Matrix( double  (*matrix)[ROW]  =0) : matrixSize_(sizeof(double) * COLOM * ROW)
    {
    
    
        double    tmpMatrix [COLOM][ROW] = {{0,0}, {0,0}};
    
    
        if (matrix == 0)
        {
            memcpy(matrix_, tmpMatrix, matrixSize_);
        }
        else
        {
            memcpy(matrix_, matrix, matrixSize_);
        }
    
    
    }
    
    
    Matrix::Matrix(const Matrix& m) : matrixSize_(m.matrixSize_)
    {
        memcpy (matrix_, m.matrix_, matrixSize_);
    }
    
    
    bool Matrix::isSingular(void)
    {
        return (det() == 0);
    }
    
    
    double Matrix::det(void)
    {
        return (matrix_[0][0]*matrix_[1][1] - matrix_[1][0]*matrix_[0][1]);
        //DET = ad-bc
    }
    
    
    void Matrix::print(void)
    {
        for (int i=0; i < ROW; i++)
        {
            cout << "Row " << i << " : ";
            for (int j=0; j < COLOM; j++)
            {
                cout << matrix_[j][i] << " ";
            }
            cout << "\n";
        }
    }
    Alles anzeigen

    Vielen Dank für jede Hilfe im Vorhinein.

    “For God's sake, give me the young man who has brains enough to make a fool of himself”, Robert Louis Stevenson

    Einmal editiert, zuletzt von baracuda (24. September 2011 um 14:56)

  • Ramses13
    4
    Ramses13
    Mitglied
    Reaktionen
    4
    Punkte
    164
    Beiträge
    31
    • 24. September 2011 um 15:10
    • #2

    Du brauchst das Array nicht extra mit delete löschen. Du hast sie ja auch nie mit new auf dem Heap angelegt.
    Oder anders gesagt: Der Speicher für das Array wird direkt in der Matrix reserviert und mit dem Löschen der Matrix frei gegeben. Und wenn du immer nur eine 2x2 Matrix brauchst, dann ist das wohl auch so die beste Lösung.
    Lösche also ganz einfach den Destruktor[edit].

    2 Mal editiert, zuletzt von Ramses13 (24. September 2011 um 15:13)

  • totycro
    2
    totycro
    Mitglied
    Punkte
    40
    Beiträge
    7
    • 24. September 2011 um 22:48
    • #3

    Prinzipiell gilt: Delete everything you new.

    z.B.:

    Code
    int ** arr = new int*[N0];
    for (int i=0; i<n0; ++i) {
      arr[i] = new int[N1];
    }
    
    
    // Verwendung von arr
    
    
    for (int i=0; i<n0; ++i) {
      delete[] arr[i];
    }
    delete[] arr;
    Alles anzeigen
  • Maximilian Rupp 27. Dezember 2024 um 00:26

    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