Problem beim fregeben von Speicher mit delete unter Windows



  • Hallo,

    wenn ich in einer Methode einer Klasse Dynamischen Speicher anfordere:

    BYTE * pb1= NULL;
    pb1 = new BYTE[200];
    

    und im Destruktor wieder freigebe:

    delete pb1;
    //oder delete[] pb1; Egal
    

    oder so:

    if (NULL != pb1) delete pb1;
    

    bekomme ich eine Schutzverletzung unter windows angezeigt.
    Woran kann das liegen?
    Habe das auch schonmal gehabt, wenn ich den Speicher in einer Funkion beziehe und im Hauptprogramm wieder freigebe.

    Wenn jemand BEscheid weiß, bitte Posten.
    Danke, Gruß Manni



  • wird speicher mit new [] allokiert muss er mit delete [] freigegeben werden. wird nur mit new allokiert, wird auch nur mit delete freigegeben

    if (pbl)
    {
        delete[] pbl;
        pbl = NULL,
    }
    


  • Ist pb1 ein Klassen-Member, oder nur lokal in der Member-Methode deklariert? Falls letzteres, dann ist es ja im Destruktor nicht mehr bekannt. BTW kann man sich afaik den Vergleich mit NULL sparen - schadet aber natürlich nicht 😉



  • Ist ein Member. Ob private oder public macht keinen Unterschied.



  • Manni76 schrieb:

    Ist ein Member. Ob private oder public macht keinen Unterschied.

    Doch, public ist böse[tm].

    Ist aber nicht wirklich ein WinAPI-Problem (BYTE kannst du durch unsigned char ersetzen). Wahrscheinlich liegt den Problem auch woanders.
    Du musst dem Zeiger übrigens weder 0 zuweisen noch auf 0 testen. Die Zuweisung ist sinnlos, da der Zeiger nach dem Destruktor eh nicht mehr existiert; das if ist sinnlos, weil delete genau das gleiche schon selbst macht.



  • Dieser Thread wurde von Moderator/in cd9000 aus dem Forum WinAPI in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich bitte um Entschuldigung.

    if (NULL != pb1) delete pb1;
    

    Du hast natürlich recht, delete ist nicht böse wenn ich ihm einen Nullzeiger gebe.
    Aber Um Urscahen auszuschliessen wenn man nix mehr weiter weiß...

    Ist ein Member. Ob private oder public macht keinen Unterschied.
    Doch, public ist böse[tm].

    war so nicht gemeint, nur für mein Problem macht es keinen Unterschied.



  • du darfst 'pbl' auch nicht verändern. 'delete' muss exakt den gleichen wert bekommen, den 'new' ausspuckte



  • net schrieb:

    du darfst 'pbl' auch nicht verändern. 'delete' muss exakt den gleichen wert bekommen, den 'new' ausspuckte

    Klar. Bin ja nicht blöd 😉



  • Manni76 schrieb:

    net schrieb:

    du darfst 'pbl' auch nicht verändern. 'delete' muss exakt den gleichen wert bekommen, den 'new' ausspuckte

    Klar. Bin ja nicht blöd 😉

    war nicht böse gemeint. sowas kann schon mal passieren, irgendein wilder pointer macht dir 'pbl' kaputt z.b. kannst ja ein paar ausgaben einbauen, rückgabewert von 'new' und später das, was an delete übergeben wird.



  • net schrieb:

    war nicht böse gemeint.

    Kein Prob. Hab ja den Smilie 😉 gemacht.

    Ich dachte das Problem sei vielleicht Windowsspezifisch.
    Ich weiß nicht wie Windows den Bereich für erleubte Speicherzugriffe verwaltet.


Anmelden zum Antworten