int als Argument für delete



  • Du kannst die daten nur loeschen, wenn sie im heap (freispiecher) liegen. dazu benoetigst du einen zeiger:

    int* pint = new int[5];

    um einen wert zu loeschen, schreibste

    delete pint[0];

    um alles zu loeschen, schreibste

    delete [] pint;

    und nicht vergessen wilde zeiger vorzubeugen

    pint=0;



  • delete schrieb:

    delete pint[0];

    man kann keine integerwerte deleten



  • ich kann sie loeschen wie ich lustig bin



  • Da klingelt es doch in meinem Kopf "undefiniertes Verhalten!" ⚠



  • Also ich kann das folgende Programm problemlos kompilieren:

    //
    #include <iostream>
    
    using namespace std;
    
    void main()
    {
        int* pint = new int(3);
        cout<<*pint;
        delete pint;
    
        getchar();
    }
    

    Dev-C++ Compiler



  • delete schrieb:

    Also ich kann das folgende Programm problemlos kompilieren:

    Held.
    Es ging um delete pint[0]



  • Bashar schrieb:

    delete schrieb:

    Also ich kann das folgende Programm problemlos kompilieren:

    Held.
    Es ging um delete pint[0]

    ich darf zitieren:

    man kann keine integerwerte deleten



  • @delete
    meinst du das ernst?

    In dem Code (nicht nur, dass er falsch ist, siehe void main 🙄) ist die Situation eine andere, du erzeugst ein int-Objekt und initalisierst das Objekt mit 3 und löschst es wieder. Du sprachst aber vorher davon, Speicher für ein Array zu initalisieren und dann delete für die Werte (!) davon aufzurufen.

    (@Moderatoren bitte Splitten)



  • delete schrieb:

    Bashar schrieb:

    Es ging um delete pint[0]

    ich darf zitieren:

    man kann keine integerwerte deleten

    Wenn pint ein Zeiger auf int ist, dann ist pint[0] ein Integerwert, und darf als solcher nicht deleted werden.

    Ich denke der Subthread gehört ins Trollforum.



  • Mal ne andere Frage (die sich auch auf delete bezieht, weshalb ich keinen eigenen Thread öffnen möchte):
    Welcher Unterschied besteht zwischen delete und delete[]? Das Betriebssystem muß doch nur wissen, welcher Speicher (also übergebener Pointer) gelöscht werden soll und weiß selbst, wieviel Speicher das war, oder nicht? Sonst müßte doch delete[] auch eine Art size-Parameter mitbekommen... 🙄



  • delete kann die Größe des Speicherblockes aus der Größe des zu löschenden Datentyps herausfinden. delete[] dagegen braucht in jedem Falle die Information über die Anzahl der Array-Elemente. Die parallele Existenz dieser beiden Operatoren gibt einem Compilerbauer also die Möglichkeit, die Blockgröße bei einfachen Typen nicht mitzuspeichern. Ob die das im konkreten Fall auch machen, bleibt ihnen natürlich überlassen. AFAIK ist new/delete beim GCC über malloc/free implementiert, da steht die Größe also immer dabei. Aber man kann operator new und operator delete ja überschreiben ...

    Dazu kommt, dass bei Klassentypen delete nicht alle Destruktoren aufruft. BTW; grad getestet, g++ 3.2.2 produziert beim einfachen delete auf ein Array ein Segmentation Fault. Bei anderen Compilern ist das nicht unbedingt der Fall.



  • Cocaine schrieb:

    Mal ne andere Frage (die sich auch auf delete bezieht, weshalb ich keinen eigenen Thread öffnen möchte):
    Welcher Unterschied besteht zwischen delete und delete[]?

    Bei new ist die angeforderte groesse immer gleich sizeof(T)
    Bei new[] ist die angeforderte groesse immer gleich sizeof(T)*n

    nun muss delete nur sizeof(T) bytes loeschen
    delete[] allerdings sizeof(T)*n bytes.

    man kann also bei new/delete das n weglassen - und spart sich somit zB 4 byte speicher (weil n zB ein unsigned int ist)

    4 Byte fuer die groessenangabe waeren hier zB totaler overkill

    char* p=new char;

    deshalb gibt es new und new[]



  • Wenn pint ein Zeiger auf int ist, dann ist pint[0] ein Integerwert, und darf als solcher nicht deleted werden.

    Dann verhaelt sich das mit allen anderen Datenypen genauso?



  • Danke @Bashar, Shade.

    Beim VC++6 scheint es keinen Unterschied zu machen, ob delete oder delete[], wird also wohl immer die Anzahl mitgespeichert...



  • Cocaine schrieb:

    Danke @Bashar, Shade.

    Beim VC++6 scheint es keinen Unterschied zu machen, ob delete oder delete[], wird also wohl immer die Anzahl mitgespeichert...

    sicher?

    probier mal

    int main()
    {
      int* p=new int;
      delete [] p;
    }
    

    Bitte im Debug Mode testen, ohne optimierungen

    theoretisch müsste er dann schreien, aber es ist eben undefiniertes verhalten, also kann es passieren, dass nix passiert.



  • delete schrieb:

    Wenn pint ein Zeiger auf int ist, dann ist pint[0] ein Integerwert, und darf als solcher nicht deleted werden.

    Dann verhaelt sich das mit allen anderen Datenypen genauso?

    Ja



  • Shade Of Mine schrieb:

    sicher?

    probier mal
    [...]

    Jo, sicher. 🙂

    VC++6 liefert bei deinem Beispiel lediglich ein:

    c:\project\test\main.cpp(51) : warning C4508: 'main' : Funktion sollte einen Wert zurueckgeben; Ergebnistyp 'void' angenommen

    😉

    Folgendes funktioniert ebenfalls:

    int main()
    {
    	int* p=new int[5]; 
    	delete p; 
    	return 0;
    }
    


  • interessant, da hat der vc++ wohl einen performance bug


Anmelden zum Antworten