wie komme ich an das "heap-objekt"?



  • class beispiel
    {
    public:
        beispiel()
    {
        cout<<"objekt erstellt!\n";
    }
        protected:
    };
    
    int main()
    {
        int wahl;
    
        do
        {
            cout<<"objekt erstellen? 1 fuer JA\n";
            cin>>wahl;
    
        }while(wahl == 1);
    
        if(wahl == 1)
        {
            beispiel *obj = new beispiel;
        }
        return 0;    
    }
    

    ich habe den ganzen code genommen , da ich glaube , dass mein anliegen dadurch am besten zu verstehen ist:D

    wenn ich ich mehrmals hintereinander ein objekt vom typ beispiel auf dem heap erstelle,wie kann ich dann später auf eines dieser objekte zugreifen? wie identifiziert der computer das objekt? ein ansatz von mir war ,dass die objekte in einer art array gespeichert werden. Jedoch konnte ich nichts brauchbares schreiben um das herauszufinden.

    ich danke für eure hilfe:)


  • Mod

    Wenn du das so machst, dann werden die Objekte weder in einer Array-artigen Struktur erstellt, noch kannst du später überhaupt noch an die Objekte kommen. Außerdem hast du ein riesiges Speicherleck.

    Was du hier suchst (und was allgemein ungeheuer nützlich ist), ist std::vector. Das ist eine Array-artige Struktur, du kannst über den Vector auf die Objekte zugreifen, und der Vector kümmert sich um die Speicherverwaltung (und zwar richtig!).



  • ah alles klar danke für die antwort:) mit vectoren kann ich schon umgehen ich habe mich nur gefragt ob man das auch so "handlen" kann:D

    👍 👍



  • du kannst dir natürlich einen eigenen vector zusammenbauen.
    btw, wenn du new verwendest, musst du dir immer auch die frage stellen: wo muss jetzt überall ein delete hin? wenn du das nicht beantworten kannst, dann verwende new nicht.

    du kannst dir z.b. ein array aus zeigern auf die objekte behalten.

    #include <array>
    //...
    
    int main()
    {
        int wahl;
        std::array<beispiel*, 10>  arr;    
    //...
        arr[0] = new beispiel;
    //...
        delete arr[0];
    }
    


  • ja diesen code werde ich mir aufjedenfall aufschreiben danke:) funktioniert aber nur mit c++ 11


  • Mod

    eniddelemaj schrieb:

    ja diesen code werde ich mir aufjedenfall aufschreiben danke:) funktioniert aber nur mit c++ 11

    Nein, lieber nicht, denn das ist ja gerade, wie man es nicht macht. Im Anwendercode hast du niemals ein new und delete. Schlimmstenfalls, wenn absolut kein anderer Container passt, hast du einen unique_ptr oder anderen Smartpointer. Der Trick bei diesen Klassen ist, dass sie in ihrem Destruktor ein delete machen (und auch bei Kopien und Zuweisungen alles richtig machen). Da der Destruktor in C++ garantiert automatisch aufgerufen wird, wenn ein Objekt den Scope verlässt (außer man macht ganz, ganz schlimme Sachen), kann man das delete gar nicht mehr vergessen. Ressourcenlecks ausgeschlossen. Mehraufwand Null, eher sogar negativ. Daher kein Grund, darauf zu verzichten. Dies ist eine der Hauptattraktionen der Sprache C++.



  • tut mir leid da habe ich das thema zu voreilig abgehakt. okay danke das werde ich beherzigen.


Anmelden zum Antworten