struct + zeiger?



  • Wenn ein Mod spricht sollte man hinhören 🙂

    Hast Du einen ordentlichen Link für die Speicherverwaltung?

    lg Max



  • Das erste Beispiel ist völliger Mist. 😉

    Du speicherst dir in der Klasse ja lediglich einen Zeiger auf char. Wenn du da jetzt aber speicher zuweist und dann nachher per = "Hallo" einen neuen Speicher zuweist, dann geht der Speicher verloren. Das ist bis jetzt so noch kein Problem. Das Problem kommt erst, wenn du du den Speicher freigeben willst. (Wenn du das delete auskommentierts, dann gibts auch keinen Fehler, der Memory Leak bleibt aber).
    Das untere Beispiel macht etwas ganz anderes. Du fordrst das Objekt test an und machst nacher das richtige mit einem Zeiger.Jedoch solltest du das mit delete freigeben und nicht mit delete[], da es ja kein Array ist.



  • Hallo

    Ich war mir sicher im zweiten Beispiel auch ein

    test->text = new char[6];
    

    zu sehen, wurde es schon wegeditiert?

    Tutorials zum Thema C-Strings wirst du eher im Ansi-C Forum finden, hier im C++ Forum vermeidet man rohe Speicherverwaltung lieber und benutzt std::string.

    bis bald
    akari



  • akari schrieb:

    Hallo

    Ich war mir sicher im zweiten Beispiel auch ein

    test->text = new char[6];
    

    zu sehen, wurde es schon wegeditiert? Aber auch ohne das sind beide nicht gültig, durch das delete auf ein String-Literal.

    Tutorials zum Thema C-Strings wirst du eher im Ansi-C Forum finden, hier im C++ Forum vermeidet man rohe Speicherverwaltung lieber und benutzt std::string.

    bis bald
    akari

    Wenn er delete test; macht, dann pasts wieder. (Er fordert ja das Objekt an und nicht den string).



  • Hallo

    Ich merk schon wir kommen hier schon zeitlich durcheinander... bleibt gar nicht genug Zeit seine Beiträge zu korrigieren 😉

    So wie das zweite Beispiel jetzt dasteht hat drakon natürlich Recht.

    bis bald
    akari



  • @akari: Nein, im zweiten Beispiel ist nie ein test->text = new char[6]; gewesen.

    Danke erstmal, d.h. also folgendes wäre korrekt:

    struct TEST
    {
        char* text;
    };
    
    int main()
    {
        TEST* test;
        test = new TEST;
        test->text = "Hallo";
    
        // mache irgendwas
    
        delete test;
    }
    

    Was wiederum bedeutet, dass mit "new TEST" auch für test->text Speicher reserviert wird? Aber wieviel ist das?

    lg Max



  • In dem Fall sollte 'text' wie folgt deklariert sein:

    struct TEST
    {
        const char* text;
    };
    

    Was wiederum bedeutet, dass mit "new TEST" auch für test->text Speicher reserviert wird? Aber wieviel ist das?

    Genau so viel wie ein Zeiger auf deinem Rechner benötigt (vermutlich 4 oder 8 Byte).



  • Hm... wieso?

    lg Max



  • für test->text wird zwar speicher reserviert, aber test->text selbst zeigt nicht auf reservierten speicher, sondern ins nirvana. erst mit test->text = "Hallo" zeigt test->text auf eine speicherstelle, auf die du zugreifen darfst (allerdings nur lesend!).

    das beispiel, das du suchst, um zu verstehen, was man dir schreibt:

    char* text = new char[6];
    strncpy (text, "Hallo", 6);
    delete[] text;
    

    dieses beispiel macht genau das, was du in deinem allerersten beispiel versuchtest du zu erreichen; nur dass es funktioniert.



  • struct TEST
    {
        char* text;
    };
    
    int main()
    {
        TEST* test;
        test = new TEST;
        test->text = new char[6];
    
        strncpy(test->text,"Hallo",6);
    
        // mache irgendwas
    
        delete[] test->text;
        delete test;
    }
    

    Funktioniert! Danke!

    lg Max





  • Gibt es eigentlich einen guten Grund den ganzen Kram auf den Heap zu schaufeln?



  • David_pb schrieb:

    Gibt es eigentlich einen guten Grund den ganzen Kram auf den Heap zu schaufeln?

    Ich denke mal, dass er das mehr als Übung gemacht hat und nicht als reeles Beispiel.



  • Korrekt.

    Der eigentliche Zweck soll sein eine beliebige Anzahl an structs dieser Art (d.h. mit enthaltenen Zeigern) erstellen zu können, ohne bei Nichtnutzung überflüssigen Speicherplatz reserviert zu haben.

    lg Max


Anmelden zum Antworten