Speicherfreigabe mit new bei Dreifachpointer



  • q150022 schrieb:

    Hi Deadlef,

    bitte nicht hauen! aber wie machst Du es mit Drei-fachpointer? Ich bekomme es nicht hin 😞

    int ***matrix;
    matrix = new int**[dim];
    for(int i = 0; i < dim; ++i) {
       matrix[i] = new int*[dim];
       for (int j = 0;j < dim;++j)
           matrix[i][j] = new int[dim];
    }
    ...
    for (i = 0;i < dim;i++) {
       for(int j = 0; j < dim; ++j)
           delete[] matrix[i][j];
       delete[] matrix[i];
    }
    delete[] matrix;
    

    Wenn ich mich jetzt nirgends vertippselt habe, sollte das so funktionieren.

    mfg
    v R



  • Das mag der der Debugger auch nicht. In der ersten delete-Zeile kommt eine Fehlermeldung...



  • und welche???



  • Unbehandelte Ausnahme bei 0x77f767cd in Test.exe: Benutzerhaltepunkt.



  • q150022 schrieb:

    Unbehandelte Ausnahme bei 0x77f767cd in Test.exe: Benutzerhaltepunkt.

    Ich bin mir da nicht sicher, da ich das ehrlich gesagt noch nicht gemacht hab
    (ein drei-dim-Array dynamisch erstellt), aber ich glaube Helium hat die Loesung
    gepostet, indem du dem zweiten delete noch nen Index mitlieferst, also

    delete[i] matrix[i];
    

    Wie gesagt, bin mir da nich 100% sicher.

    mfg
    v R



  • q150022 schrieb:

    Hi,

    ich habe folgenden Code zum allokieren eines Dreifachpointers:

    void Alloc_3Int(int intValues[5][5])
    {
        m_pppInt = new int**;
    
        for(int i = 0; i < 5; i++)
        {
            m_pppInt [i] = new int*[5];
            for(int j = 0; j < 5; j++)
                m_pppInt[i][j] = new int[5];
        }
        for(int i = 0; i < 5; i++)
            for(int j = 0; j < 5; j++)
                m_pppInt[i][j] = &intValues[i][j];
    }
    

    Normalerweise würde die Freigaberoutine so aussehen:

    for (int i = 0; i != 5; ++i) {
    	for (int j = 0; j != 5; ++j) {
    		delete [] m_pppInt[i][j];
    	}
    	delete [] m_ppInt[i];
    }
    delete [] m_ppInt;
    

    In deinem Allozierungscode sind aber mindestens zwei Sachen.

    Erstens

    m_pppInt = new int**;
    

    dein m_pppInt wird als Array benutzt also sollte es heißen:

    m_pppInt = new int**[5];
    

    Dann klappt auch die letzte Zeile meiner freigabe.

    Zweistens weist du m_pppInt[i][j] erst ein int[5] zu und dann überschreibst du dies mit einem Wert aus intValues[i][j]. Der zuerst allozierte Pointer ist dann Weg. Also glaube ich, dass eigentlich folgendes gemeint war:

    m_pppInt[i][j][k] = intValues[i][j][k]
    


  • Also ich habe eine Variable die vom Typ

    int Int2D[5][5];
    

    ist. In einer Funtion möchte ich diese Variable per call by reference übergeben und dort mit Werten füllen. Das mache ich wie folgt:

    Alloc_3Int(Int2D);
    

    und Alloc_3Int sieht wie folgt aus:

    void Alloc_3Int(int intValues[5][5])
    {
        m_pppInt = new int**;
    
        for(int i = 0; i < 5; i++)
        {
            m_pppInt [i] = new int*[5];
            for(int j = 0; j < 5; j++)
                m_pppInt[i][j] = new int[5];
        }
        for(int i = 0; i < 5; i++)
            for(int j = 0; j < 5; j++)
                m_pppInt[i][j] = &intValues[i][j];
        //tue etwas mit m_ppInt...
    }
    

    Dadurch wird meine ursprüngliche Variable Int2D[5][5] im Hauptprogramm tatsächlich geändert und mit Werten gefüllt, die ich in Alloc_3Int gemacht hatte. Was mir jetzt fehlt ist die Speicherfreigabe



  • q150022 schrieb:

    void Alloc_3Int(int intValues[5][5])
    {
        m_pppInt = new int**;
    
        for(int i = 0; i < 5; i++)
        {
            m_pppInt [i] = new int*[5];
            for(int j = 0; j < 5; j++)
                m_pppInt[i][j] = new int[5];
        }
        for(int i = 0; i < 5; i++)
            for(int j = 0; j < 5; j++)
                m_pppInt[i][j] = &intValues[i][j];
        //tue etwas mit m_ppInt...
    }
    

    Dadurch wird meine ursprüngliche Variable Int2D[5][5] im Hauptprogramm tatsächlich geändert und mit Werten gefüllt, die ich in Alloc_3Int gemacht hatte. Was mir jetzt fehlt ist die Speicherfreigabe

    Die Funktion Alloc_3Int ist noch nicht korrekt. Lies dir nochmal durch, was ich dazu geschrieben habe. So kann es nicht funktionieren. Und wenn du es nicht glaubst, schick dein Programm durch valgrind. Das wird es dir schon sagen.



  • // if(m_pppInt != NULL) <- sinnlos, delete auf NULL funktioniert ohne effekt

    Ehe du ihn deletes dereferenzierst du ihn aber und damit ist der nicht sinnlos...



  • Ich denke, der C++-Standard sollte so etwas einfach verbieten. 😉


Anmelden zum Antworten