DELETE() - Wird das Objekt wirklich gelöscht?



  • @DocShoe also müsste im Konstruktor neuer Speicher reserviert werden in dem der Wert des Pointers geschrieben wird oder wie in einer obigen Antwort steht dass free() einfach aus dem destruktor löschen?



  • @SeppJ mhh ich denke ich spreche ihn mal darauf an. ^^ Vielleicht habe ich auch einfach einen Fehler gemacht und mal für ein paar Minuten nicht zugehört. 😃 an sich werden uns nur die Aufgaben gegeben und mMn dürftige Dokumentationen über diese Themen die wir dann zur Lösung nutzen sollen. Am Ende verschlägt es mich dann aber doch entweder in Foren wie dieses hier, zu gut und anschaulich erklärende Youtube-tutorials oder eben stundenlanges grübeln ausprobieren bis ich eine funktionierende, anscheinend halbwegs annehmbare, Lösung finde die jedes Wissen aus den Vorlesungen oder der Dokumentation über Bord wirft.



  • @wob oh ja natürlich ^^ in C++ bin ich auch schon über einfachere Methoden zur Einlesung für Zeichen gestoßen wobei ich diese noch nicht ausprobiert habe und zeichenketteEinlesen() entstammt dem ersten Semester (C), indem es wie du schon sagtest um manuelle (dynamische) Speicherverwaltung ging und Arrays.. Schleifen.. pipapow, die wir im zweiten Semester (C++) in dem ich mich jetzt befinde weiterverwenden sollten.



  • Ich finde es lustig wie hier über Code diskutiert wird, von dem wir wichtige Teile noch nichtmal gesehen haben. Wie sieht die Klasse Auto aus, was hat sie für Member? Was gibt es noch für Memberfunktionen ausser ctor und dtor und wie sind diese implementiert? Klar, man kann hier einen "educated guess" machen und wird damit vermutlich sogar richtig liegen, aber IMO naheliegend wäre erstmal den OP zu fragen.



  • @hustbaer reicht die Definition der Autoklasse dafür nicht? Wollte hier eig. nicht zu viel Code auf einmal posten, so heißt es jedenfalls im angepinnten "Du brauchst Hilfe" Thema. ^^

    aber wenn du sie sehen möchtest. die gesamte .cpp oder nur die .h?



  • @StudiengangPanik
    Die cpp reicht, wenn die Funktionen nicht im Header implementiert sind.



  • @CTecS sagte in DELETE() - Wird das Objekt wirklich gelöscht?:

    In welchen Metadateien sollte das sein, dafür gibt es die MMU die das Adressmapping macht.

    Jede Standardlibrary cached üblicherweise Speicheranforderungen und gibt sie nur nach internen Algorithmen wirklich wieder frei, in dem sie das OS unterrichtet. Das ist deutlich schneller, als alles gleich ans OS durchzureichen. Daher sind Speicherzugriffe auf bereits freigegebene Speicherbereiche möglich, die nicht zu segfaults führen. Ferner kann man bei C oder C++ nicht davon ausgehen, dass überhaupt ein OS darunter liegt, oder dass überhaupt virtuelle Adressräume genutzt werden.

    Und nein dem TO hier in jedem 2. Post nahe zu legen das er doch std::string benutzen soll, wird für ihn eine weniger Zielführende Hilfe sein. Er soll sich eben mit der Speicherverwaltung auseinander setzen.

    Das ist leider ein Dauerbrenner in diesem Forum.


  • Mod

    @StudiengangPanik sagte in DELETE() - Wird das Objekt wirklich gelöscht?:

    @DocShoe also müsste im Konstruktor neuer Speicher reserviert werden in dem der Wert des Pointers geschrieben wird oder wie in einer obigen Antwort steht dass free() einfach aus dem destruktor löschen?

    Kommt drauf an, wie nahe du dich an die Aufgabenstellung halten willst. Wie schon gesagt, merkst du, dass du "richtiges" C++ machst daran, dass du dich nicht mehr um Speicherverwaltung kümmern brauchst. Das ist das, was in der allerersten Antwort mit "Rule of zero" gemeint ist. Wenn du es also wirklich richtig machen willst, dann baust du dein gesamtes Programm total anders auf. Dann lernst du gutes C++, aber bekommst eine schlechte Note von deinem schlechten Lehrer 😕



  • @SeppJ sagte in DELETE() - Wird das Objekt wirklich gelöscht?:

    Kommt drauf an, wie nahe du dich an die Aufgabenstellung halten willst. Wie schon gesagt, merkst du, dass du "richtiges" C++ machst daran, dass du dich nicht mehr um Speicherverwaltung kümmern brauchst.

    Es kommt wie immer auf den Kontext an. I.d.R. braucht man sich nicht mehr um die Speicherverwaltung zu kümmern, aber es gibt sehr gut begründete Ausnahmen wo man es eben doch tun muss, weil es mit C++ nicht anders geht. Ein Großteil der Problematik resultiert aus Designfehler in der Standardbibliothek.



  • @StudiengangPanik Naja ich persönlich finde es z.B. doof wenn ich raten muss was ein Member wohl für einen Typ haben könnte. In dem von dir gezeigten Code muss modell fast const char* für sein, aber wie gesagt, sowas raten zu müssen finde ich unspannend.

    Ebenso die Frage welche Funktionen (speziell welche "speziellen" Funktionen wie z.B. Copy-Ctor und Assignment-Operator) hat die Klasse ausser den gezeigten noch? Vermutlich keine, aber stehen tut das auch nirgends.

    Ansonsten... wenn du noch Fragen hast... nachdem du hier ja bereits einiges an Input bekommen hast, wäre vermutlich gut wenn du deinen aktuellen Code nochmal zeigst. Damit man sieht was du jetzt wie umgesetzt hast.



  • @DocShoe @hustbaer

    #include <iostream>
    #include <cstdlib>
    #include <string>
    #include <iostream>
    #include <stdio.h>
    #include "Auto.h"
    
    using namespace std;
    
    //Standardkonstruktor
        Auto::Auto()
        {
            this->modell = "";
            this->anzTueren = 0;
            this->leistung = 0;
        }
    
    //Initialisierungskonstruktor
        Auto::Auto(char* modell, int anzTueren, int leistung)
        {
            this->modell = modell;
            this->anzTueren = anzTueren;
            this->leistung = leistung;
        }
    
    //Getter & Setter
        void Auto::setModell(char* newModell)
        {
            this->modell = newModell;
        }
    
        char* Auto::getModell()
        {
            return this->modell;
        }
    
        void Auto::setAnzTueren(int newAnzTueren)
        {
            this->anzTueren = newAnzTueren;
        }
    
        int Auto::getAnzTueren()
        {
            return this->anzTueren;
        }
    
        void Auto::setLeistung(int newLeistung)
        {
            this->leistung = newLeistung;
        }
    
        int Auto::getLeistung()
        {
            return this->leistung;
        }
    
    //Ausgabe
        void Auto::ausgabe()
        {
            cout << "\nModell: " << this->modell << "\nTuerenanzahl: " << this->anzTueren << "\nLeistung: " << this->leistung << " PS.\n" << endl;
        }
    
    //Destruktor
        Auto::~Auto()
        {
            if(this->modell != NULL)
            {
                //free(this->modell);
                cout << "\nDas Auto " << this->modell << " wurde geloescht!" << endl;
            }
        }
    

    vermutlich ein wenig zu viele bibliotheken aber gut.. und hier wirft nur Zeile 13 eine Warnung

    "deprecated conversion from string constant to 'char*' [-Wwrite-strings] "

    ich sage es aber nochmal das Programm wurde als bestandene Aufgabe anerkannt. Also ja eventuell ein Armutszeugnis für die Uni. 😃


  • Mod

    @john-0 sagte in DELETE() - Wird das Objekt wirklich gelöscht?:

    @SeppJ sagte in DELETE() - Wird das Objekt wirklich gelöscht?:

    Kommt drauf an, wie nahe du dich an die Aufgabenstellung halten willst. Wie schon gesagt, merkst du, dass du "richtiges" C++ machst daran, dass du dich nicht mehr um Speicherverwaltung kümmern brauchst.

    Es kommt wie immer auf den Kontext an. I.d.R. braucht man sich nicht mehr um die Speicherverwaltung zu kümmern, aber es gibt sehr gut begründete Ausnahmen wo man es eben doch tun muss, weil es mit C++ nicht anders geht. Ein Großteil der Problematik resultiert aus Designfehler in der Standardbibliothek.

    1. Wenn schon, dann aber auch richtig und nicht so wie hier
    2. Diese Ausnahmen kannst du auf der ganzen Welt suchen und hinterher an einer Hand abzählen


  • @StudiengangPanik
    Mach dir nix draus, bist nicht der Erste, die Uni/Dozent auch nicht, und es wird auch nicht das letzte mal gewesen sein.
    Mach dir klar, dass du Blödsinn für deinen Schein/Klausur lernst, besteh´ das Ganze und dann vergiss es. Wenn du dann irgendwann ein mal C++ lernen möchtest besorgste dir ein gutes Buch (siehe Buchempfehlungen hier im Forum) und fängst von vorne an.



  • @hustbaer

    #ifndef AUTO_H
    #define AUTO_H
    
    #include <iostream>
    #include <string>
    #include <stdio.h>
    
    using namespace std;
    
    class Auto
    {
        private:
    
            char* modell;
            int anzTueren, leistung;
    
        public:
    //Standardkonstruktor
            Auto();
    
    //Benutzerdefinierter Konstruktor
            Auto(char* modell, int anzTueren, int leistung);
    
    //Getter & Setter
            void setModell(char* newModell);
            char* getModell();
    
            void setAnzTueren(int newAnzTueren);
            int getAnzTueren();
    
            void setLeistung(int newLeistung);
            int getLeistung();
    
    //Destruktor
            virtual ~Auto();
    
    //Ausgabe
            void ausgabe();
    };
    
    #endif // AUTO_H
    
    

    Da die Aufgabe als bestanden anerkannt wurde habe ich jetzt nicht wirklich etwas geändert. Das Thema war ja eig. nur um eine Verständnisfrage zu klären gedacht und bevor ich mir das durch neue Ansätze wieder zerschieße und Fristen nicht einhalten kann habe ich es lieber mal so belassen wie es war. Ich habe mir die ganzen Ansätze aber rausgeschrieben und die in der Studienzeit dann mal durcharbeiten.



  • @DocShoe alles klar ist notiert. 🙂 Vielen Dank auf jeden Fall. ^^



  • @SeppJ sagte in DELETE() - Wird das Objekt wirklich gelöscht?:

    1. Wenn schon, dann aber auch richtig und nicht so wie hier

    Ja, er lernt das doch und fragt deshalb hier im Forum nach. Diese ständigen überheblichen Antworten, man mache das in C++ so nicht, sind ein wesentliches Problem hier im Forum. Ein kurzer Hinweis auf eine FAQ o.ä. reicht aus, da muss man nicht den kompletten Thread damit zu müllen.

    1. Diese Ausnahmen kannst du auf der ganzen Welt suchen und hinterher an einer Hand abzählen

    Für HPC ist es eine zwingende Notwendigkeit. Die Standardcontainer sind mit einem Custom Allocator, der NUMA aware ist, nicht mehr benutzbar, da die Standard Container mit so einem Allocator UB haben. Die Speicheranforderung in ganz neuem OpenMP 5.0 (gerade im November 2018 heraus gekommen) erfolgen ausschließlich über C APIs. Dazu muss man für viele Serveranwendungen ebenfalls NUMA aware programmieren. Bei Microcontroller darf man üblicherweise keinen dynamischen Speicher nutzen. usw. usw. usw. …


  • Mod

    @john-0 sagte in DELETE() - Wird das Objekt wirklich gelöscht?:

    Für HPC ist es eine zwingende Notwendigkeit. Die Standardcontainer sind mit einem Custom Allocator, der NUMA aware ist, nicht mehr benutzbar, da die Standard Container mit so einem Allocator UB haben. Die Speicheranforderung in ganz neuem OpenMP 5.0 (gerade im November 2018 heraus gekommen) erfolgen ausschließlich über C APIs. Dazu muss man für viele Serveranwendungen ebenfalls NUMA aware programmieren. Bei Microcontroller darf man üblicherweise keinen dynamischen Speicher nutzen. usw. usw. usw. …

    Ja, da schreibst einmal deine neue Spezialklasse und benutzt die, oder benutzt eine fertige. Jedenfalls wirst du es niemals auch nur so ähnlich treiben wie es hier vorgemacht wurde.

    Ja, er lernt das doch und fragt deshalb hier im Forum nach. Diese ständigen überheblichen Antworten, man mache das in C++ so nicht, sind ein wesentliches Problem hier im Forum. Ein kurzer Hinweis auf eine FAQ o.ä. reicht aus, da muss man nicht den kompletten Thread damit zu müllen.

    Komische Probleme hast du. Da sagt man dem TE, der ja deswegen nachfragt, wie etwas korrekt gemacht wird, dann ist es überheblich…



  • @SeppJ sagte in DELETE() - Wird das Objekt wirklich gelöscht?:

    Komische Probleme hast du. Da sagt man dem TE, der ja deswegen nachfragt, wie etwas korrekt gemacht wird, dann ist es überheblich…

    Das Lernziel der Übungsaufgabe ist ganz klar die manuelle Speicherverwaltung zu erlernen. Was kommt im Thread: ein ellenlanger Sermon darüber wie schlecht das doch sei, und wie man unbedingt richtiges® C++ (heißt ohne manuelle Speicherverwaltung) lernen solle. Nützt das dem TO etwas fürs Lösen der Aufgabe? Leg eine FAQ an, verweise darauf bei solchen Fragen im Forum und helfe bei der konkreten Lösung der Aufgabe.

    Für mich gehört zum Erlernen von C++ die manuelle Speicherverwaltung unbedingt dazu, eben weil Probleme gibt, bei denen man sie benutzen muss und hier C++ gerade Vorteile bietet gegenüber anderen Sprachen. Denn wozu noch C++ lernen, wenn man die Vorteile nicht nutzt? Dann kann man gleich Rust o.ä. nutzen.



  • @john-0 Du hättest recht, wenn die C++-Speicherverwaltung denn mit all ihren Problemen korrekt gelehrt würde. Wird sie aber nicht, wie man häufig genug an den Aufgaben und teilweise hier geposteten Erklärungen/Lösungen erkennt. Es wird irgendwie was mit new und delete oder malloc/realloc geleht und dann unmotiviert irgendwie in Klassen, die damit nichts zu tun haben sollten, gesteckt. Dadurch wird den Lernenden problematischer/nicht korrekter Code als "so macht man es von Hand" beigebracht. Die Lernenden lernen dabei nur: "wenn ich was mit C++ macht, ist alles furchtbar und das Programm stürtzt dauernd ab, C++ ist scheiße". Und das ist das Problem und der Grund, warum wir hier so darauf rumhacken.

    Ich stimme zu, man könnte ne schöne FAQ dazu schreiben - nur bringt's was? Das erinnert mich ein wenig an "Stop teaching C" von Kate Gregory (https://www.youtube.com/watch?v=YnWhqhNdYyk) Wenn man C++ lehren will, sollte man nicht C++ im C-Stil lehren. Und da hat sie recht.



  • @wob sagte in DELETE() - Wird das Objekt wirklich gelöscht?:

    @john-0 Du hättest recht, wenn die C++-Speicherverwaltung denn mit all ihren Problemen korrekt gelehrt würde.

    Es geht halt darum, dass die Studenten überhaupt noch eine Sprache kennen lernen in der man von Hand Resourcen verwalten kann/muss. Die meisten Programmiersprachen tun dies nicht mehr. Es ist ein erhebliches Defizit es nicht mehr zu lernen. Was den korrekten Weg betrifft: Es ist meines Erachtens viel zu fordernd direkt mit Allocatoren anzufangen, und zu erwarten, dass Anfänger da einem folgen können. Man wird also in C++ nicht umhin kommen, erst mit new/delete zu arbeiten. Natürlich könnte man auch zuerst mit C anfangen, aber dann müssten die Studenten eine weitere Sprache lernen, und dann hat man noch größere Probleme korrektes C++ zu vermitteln. Du hast ja selbst den Link auf den CppCon Vortrag beigetragen, in dem aufgefordert wird nicht mit C anzufangen.

    Wird sie aber nicht, wie man häufig genug an den Aufgaben und teilweise hier geposteten Erklärungen/Lösungen erkennt. Es wird irgendwie was mit new und delete oder malloc/realloc geleht und dann unmotiviert irgendwie in Klassen, die damit nichts zu tun haben sollten, gesteckt. Dadurch wird den Lernenden problematischer/nicht korrekter Code als "so macht man es von Hand" beigebracht.

    Alle Tutorials sind mehr oder minder schlecht an der Uni. Wenn ich da zurückblicke wie lange an der Uni Fortran 77 den Studenten beigebracht wurde, obwohl zu diesem Zeitpunkt bereit neuere Fortran Versionen und Compiler verfügbar waren. Lange war das ein g77 Problem, weil es keinen neueren FOSS Fortran Compiler gab. Aber auch als es gfortran schon jahrelang gab, mussten dann solche Infos verbreitet werden, weil die Forscher selbst nichts davon wussten, dass es einen neueren FOSS Compiler gibt.

    Üblicherweise investieren Dozenten nicht sonderlich viel Energie in Vorlesungen, die sich nicht mit den Themen beschäftigen, die sie in ihrer aktuellen Forschungsarbeit nutzen. D.h. wenn ein Dozent C++ auf aktuellen Stand selbst nutzt, dann ist die Chance hoch, dass sich das auch in den Beispielen in der Vorlesung wiederfindet. Nur wer von den reinen Informatikern nutzt wirklich noch C++?

    Die Lernenden lernen dabei nur: "wenn ich was mit C++ macht, ist alles furchtbar und das Programm stürtzt dauernd ab, C++ ist scheiße". Und das ist das Problem und der Grund, warum wir hier so darauf rumhacken.

    Nur erreichst Du damit wenig bis gar nichts, denn die Studenten müssen wohl oder übel die Aufgaben nach Aufgabenstellung lösen. Wenn man die Dozenten anschreiben würde, wäre zumindest der richtige Adressat gewählt, aber ob es da auch die passende Bereitschaft gibt sich zu ändern darf bezweifelt werden.

    Deshalb wenn schon manuelle Speicherverwaltung, dann sollte man auf den korrekten Umgang damit in C++ hinweisen. Das löst die Aufgabe und führt auf den richtigen Weg.


Anmelden zum Antworten