Frage zu delete



  • Hab eine Frage was den delete[] angeht. Erst mal der Code

    #include <iostream.h>
    #include <string.h>
    #include "mystring.h"
    
    MyString::MyString(){}
    MyString::MyString(char *pchar)
    {
    szString = new char[strlen(pchar)+1];
    strcpy(szString,pchar);
    }
    MyString::~MyString(){}
    char* MyString::getString(){return szString;}
    
    void MyString::setString(char *newString){
    if(szString!=0)
    delete[] szString; :confused: 
    szString = new char[strlen(newString)+1];
    strcpy(szString,newString);
    }
    const MyString& MyString::operator=(const char *newString)
    {
    
    delete[] szString; :confused: 
    szString = new char[strlen(newString)+1];
    strcpy(szString,newString);
     :eek: 
    }
    
    int main(int argc, char *argv[])
    {
    char c;
    MyString str2;
    MyString str1("Schei...");
    cout<<str1.getString()<<endl;
    str1.setString("Keine Schei... mehr");
    cout<<str1.getString()<<endl;
    str1="So nun mit Operatorüberladung";
    cout<<str1.getString()<<endl;
    cout<<str2.getString()<<endl;
    str2="Na sowas";
    cout<<str2.getString()<<endl;
    
    cin>>c;
    
      return 0;
    }
    

    Da wo die Smileys sind. Wenn Speicher angefordert ist und ich delete[] aufrufe wird er wieder freigegeben. klar. Ich habe aber noch einen parameterlosen Konstruktor. Ich weiß macht bei Strings nicht allzuviel Sinn. Aber so bin ich drauf gekommen.

    Was passiert eigentlich wenn ich delete[] auf einen Pointer aufrufe für den ich gar kein Speicherplatz reserviert habe? Der Compiler meckert nicht.

    Und noch ne Frage da wo der letzte Smiley ist. Warum funktioniert das obwohl ich gar nichts zurückgebe. Wird da implizit der this Zeiger aufgerufen?

    Grüße Lazarus



  • Lazarus schrieb:

    Was passiert eigentlich wenn ich delete[] auf einen Pointer aufrufe für den ich gar kein Speicherplatz reserviert habe? Der Compiler meckert nicht.

    das kann abstürzen. nur die 0 verträgt es.



  • und kann ich das irgendwie abfragen oder muss ich quasi immer in weiser Voruassicht programmieren und bei Ojekterschaffung den Ponter auf Null setzen. Gibt es keine Möglichkeit abzufragen ob Speicher angefordert wurde. !=0 kann ich ja nicht machen. Wilder Pointer ist kein NullPointer. Wie wie bekomm ich raus ob ich delete[] verwenden kann oder nicht?



  • und kann ich das irgendwie abfragen oder muss ich quasi immer in weiser Voruassicht programmieren und bei Ojekterschaffung den Ponter auf Null setzen. Gibt es keine Möglichkeit abzufragen ob Speicher angefordert wurde. !=0 kann ich ja nicht machen. Wilder Pointer ist kein NullPointer. Wie wie bekomm ich raus ob ich delete[] verwenden kann oder nicht?



  • Lazarus schrieb:

    Wilder Pointer ist kein NullPointer. Wie wie bekomm ich raus ob ich delete[] verwenden kann oder nicht?

    Immer wenn du new verwendet hast kannst du delete verwenden, sonst nicht. Musst dir also wohl oder übel merken wo dein dynamischer Speicher steckt.



  • Und deshalb ist es lohnend, Pointer, die nicht sofort benutzt werden, mit 0 zu initialisieren. Ist ja eigentlich auch kein Aufwand.
    Alternativ lohnt ein Blick auf Smart-Pointer, dann hast du das ganze Problem elegant delegiert...



  • kwaart schrieb:

    Alternativ lohnt ein Blick auf Smart-Pointer, dann hast du das ganze Problem elegant delegiert...

    SmartPointer würde ich auch nicht immer ohne Bedacht einsetzen. Aber dazu gab es hier schon einige Diskussionen.



  • Dann initialisier ich wenn ich mit dem parameterlosen Konstruktor arbeite den Pointer mit null. Mit dem parameterisiertem wird ja gleich Speicher angefordert,da gibts das Prob nicht.

    Danke und cu


Anmelden zum Antworten