new & delete



  • Aber aktuelle Header und n korrektes main zu benutzen ist wohl nicht verboten, oder 😃 ?

    //Neue C++ - Header
    #include <iostream>
    #include <string>
    
    //Neue C - Header
    #include <ctdlib>
    
    using namespace std;
    
    int main() {
      //...
    
      return 0;
    }
    

    MfG

    GPC



  • Mit

    char* pstring1[30];
    

    definierst du einen array mit 30 Zeigern auf einen char (30 strings), was du sicherlich
    nicht haben willst.

    2 Möglichkeiten:

    char* pstring1 = new char[30];
    

    Dann hast du einen Zeiger auf einen char, also einen String.
    Diesen mußt du dann mit

    delete pstring1
    

    wieder freigeben.

    Besser:

    char pstring1[30];
    

    Damit hast du ein lokales, 30-Zeichen fassendes array (auch string), das
    du nicht freigeben mußt



  • Leroy42 schrieb:

    char* pstring1 = new char[30];
    

    Dann hast du einen Zeiger auf einen char, also einen String.
    Diesen mußt du dann mit

    delete pstring1
    

    wieder freigeben.

    eher mit

    delete [] pstring1;
    

    MfG

    GPC



  • CStoll schrieb:

    volkard schrieb:

    nein. an

    //#define BIL _clearscreen(_GCLEARSCREEN)
    

    erkennt man, daß es eine aufgabe der Studiengemeinschaft Darmstadt ist und da gilt die spielregel: man darf keine sprachmittel verwenden, die noch nicht offiziell vorgestellt wurden.

    In dem Fall mein Vorschlag - sagt eurem Lehrer, daß er euch den Umgang mit der STL erklären soll 😉

    (ich sehe solche Probleme eher von der praktischen Seite - was die Aufgabe löst, wird verwendet)

    [quote]
    nein, elabätsch nicht Studiengemeinschaft Darmstadt :p



  • Hallo an alle Helferlein,

    ich habe zwischenzeitlich noch gearbeitet, bevor Eure Hilfe kam und hier mein Erg.
    Kann man so auch???
    Bitte um Resonanz 🙂

    #include <iostream.h>
    #include <graph.h>
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    
    //#define BIL _clearscreen(_GCLEARSCREEN)
    
    /******************Hauptfunktion*************************************/
    
    int main(void)
    {
            char string1[70];
            char string2[70];
            char string3[70];
    
            int *z_dynam = NULL;
    //BIL;
                    z_dynam = new int[70];
    
            cout << "\n\n\n\nGeben Sie bitte den ersten String ein: \n";
            cin >> string1;
    
                    cout << "\nGeben Sie bitte den zweiten String ein: \n";
            cin >> string2;
    
           cout << "\nGeben Sie bitte den dritten String ein: \n";
           cin >> string3;
    
            cout << "\n\tDer erste String lautet: \n\t" << string1;
            cout << "\n\tDer zweite String lautet: \n\t" << string2;
            cout << "\n\tDer dritte String lautet: \n\t" << string3;
    
            delete z_dynam;
    getch();
    return(0);
    }
    


  • Erstens: Was machst du eigentlich mit z_dynam? (außer Anlegen und wieder freigeben)

    Zweitens: delete**[]** - bitte (delete ist nicht für Arrays, sondern für Einzelobjekte gedacht)



  • Und was ist damit??? LEUTE 😉

    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    
    void main(void)
    {
       char *z_dynam;
       char string1[40];
       char string2[40];
       char string3[40];
       int laenge;
    
    {
       cout << "\n\n\nGeben Sie string1 ein: \n";
       cin >> string1;
    
        cout << "\nGeben Sie string2 ein: \n";
        cin >> string2;
    
        cout << "\nGeben Sie string3 ein:\n";
        cin >> string3;
        z_dynam = new char[laenge+1];          /* Dynam.Speicher erzeugen */
    
    cout <<"\nDie eingegebene Strings Sind: \n";
    
        strcpy(z_dynam,string1);               /* Strings nach dynam spei kop */
        cout << "\n\n\ndie1.STR "<<z_dynam;    /* u.  Ausgabe  */
    
        strcpy (z_dynam,string2);
        cout <<"\ndie2.STR "<< z_dynam;
    
        strcpy (z_dynam,string3);
        cout <<"\ndie3.STR "<< z_dynam;
    
    }
     delete z_dynam;  /* Speicher freigeben */
    
    getch();
    //return (0);
    
    }
    


  • Dort steht immernoch delete z_dynam statt delete**[]** z_dynam.

    Und Du schreibst in die Variable laenge nichts rein, benutzt sie aber danach im new[] - das geht nicht gut 😉



  • Kannst Du mir einen Tip geben, denn anhand der Bildschirmausgabe sehe ich ja keinen Unterschied!!! 😡
    Ich dachte so, aber da erhalte ich eine Fehlermeldung bei delete('delete' expression is not a pointer to data)

    int laenge;
       laenge = 40;
    .
    .
    .
    
    delete z_dynam[40];
    


  • Habe mir jetzt nicht durchgesehen was das genaue Problem ist mit der Bildschirmausgabe, aber du verwendest hier

    z_dynam = new char[laenge+1];          /* Dynam.Speicher erzeugen */
    

    den Operator new[] zum allozieren von Speicher, also den Operator zum allozieren von Speicher für ein Array. Also musst du auch den Operator delete[] Aufrufen um den Speicher für dein Array wieder richtig frezugeben. Und das geht wie LordJaxom schon schrieb mit dem Operator delete[], welcher für die Freigbe von Speicher der mit new[] alloziert wurde:

    delete[] z_dynam;
    

    Die Menge des freizugebenden Speichers, macht delete ganz von allein, da musst du dir keine sorgen machen. 😉 Die Verwendung von delete (ohne []) bei Verwendung von new[] ist undefiniert und das will keiner.
    Wichtig ist nur:
    delete mit new und delete[] bei new[] verwenden. 🙂



  • Nun, wenn ich Deinen Tip anwende, dann bekomm ich errors's Warum???

    z_dynam = new[];          /* Dynam.Speicher erzeugen */
    .
    .
    .
     delete [];  /* Speicher freigeben */
    
    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    
    void main(void)
    {
       char *z_dynam;
       char string1[40];
       char string2[40];
       char string3[40];
       int laenge;
       laenge = 40;
    
    {
       cout << "\n\n\nGeben Sie string1 ein: \n";
       cin >> string1;
    
        cout << "\nGeben Sie string2 ein: \n";
        cin >> string2;
    
        cout << "\nGeben Sie string3 ein:\n";
        cin >> string3;
        z_dynam = new[];          /* Dynam.Speicher erzeugen */
    
    cout <<"\nDie eingegebene Strings Sind: \n";
    
        strcpy(z_dynam,string1);               /* Strings nach dynam spei kop */
        cout << "\n\n\nDer 1.STR "<<z_dynam;    /* u.  Ausgabe  */
    
        strcpy (z_dynam,string2);
        cout <<"\nDer 2.STR "<< z_dynam;
    
        strcpy (z_dynam,string3);
        cout <<"\nDer 3.STR "<< z_dynam;
    
    }
     delete [];  /* Speicher freigeben */
    
    getch();
    //return (0);
    
    }
    


  • volkard schrieb:

    CStoll schrieb:

    Aber vielleicht solltest du besser mit std::string arbeiten 😉

    nein. an

    //#define BIL _clearscreen(_GCLEARSCREEN)
    

    erkennt man, daß es eine aufgabe der Studiengemeinschaft Darmstadt ist und da gilt die spielregel: man darf keine sprachmittel verwenden, die noch nicht offiziell vorgestellt wurden.

    keine Studiengemeinschaft Darmstadt



  • Es wurde doch eigentlich schon mal gepostet... 🙄

    z_dynam = new[ /* hier musst du die größe eintragen */ ];          /* Dynam.Speicher erzeugen */
    
    /* Hier musst du schon angeben, _was_ er löschen soll */
    delete[] z_dynam;  /* Speicher freigeben */
    

Anmelden zum Antworten