Speicherfreigabe mit new bei Dreifachpointer



  • Nein, ich habe mich in diesem Posting lediglich verschrieben. Die Variable heißt m_pppInt.



  • m_pppInt
    

    oh mein gott, das is ja echt grausig. ma schaun ob mirr der threadautor sofort diese frage beantworten kann:

    was macht M_pppInt genau in deinem code(aber jetzt nich in den code schaun)?



  • Generelles Vorgehen bei mehrdimensionalen dynamischen Arrays:

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

    Wenn es mehr Dimensionen werden entsprechend vorgehen, also in umgekehrter Reihenfolge freigeben wie allokiert wurde



  • Hi Deadlef,

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



  • void DeAlloc_3Int() 
    { 
        if(m_pppInt != NULL) 
        { 
            delete m_pppInt; 
    
            for(int i = 0; i < 5; i++) 
            { 
                delete[i] m_pppInt[i]; 
                for(int j = 0; j < 5; j++) 
                    delete[] m_pppInt[i][j]; 
            } 
        } 
    }
    

    Du löscht erstmal das, woe all deine Anderen zeiger drin sind. Dann sind die weg und dann versuchst du sie zu löschen?

    void DeAlloc_3Int() 
    { 
        // if(m_pppInt != NULL) <- sinnlos, delete auf NULL funktioniert ohne effekt
        { 
            for(int i = 0; i < 5; i++) 
            { 
                for(int j = 0; j < 5; j++) 
                    delete[] m_pppInt[i][j]; 
                delete[i] m_pppInt[i];   
            } 
            delete [] m_pppInt; 
        } 
    }
    


  • 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