std::list und new, macht das Sinn?



  • So, ihr habt mich so weit, jetzt bin ich auch ein angemeldeter EDVoholiker auf eurer Selbsthilfeseite! ^^
    Da ich ganz Frisches Fleich im Boardmarkt bin hoffe ich, dass ihr mir dan holprigen Start an der Suchfunktion verzeiht.

    Ich habe mich seit neustem intensiver mit den std's auseinandergesetzt und für meine Belänge in Fragen "ungestackte Variablenmengen" bin ich an der schönen Templateklasse (korrigiert mich ruhig) List hängengeblieben. Ich habe mich dabei an der Möglichkeit eines Flexiblen Einsatzes derer erfreut doch leider bleibe ich gerade an der Einbettung etwas hängen.

    Das genaue Problem was ich im Moment habe und worüber ich nur begrenzt deutsche inhalte finde ist die Frage wie genau Ein std::list-Objekt gespeichert wir, bzw. wo. Ich wünsche mir z.B. eine Erzeugung in einem Klassenkonstruktor aber ich weiss momentan nicht einmal ob die Liste nun nur im Kontruktoraufruf existiert und danach zerstört wird oder ob sie schon so in einer NEW-ähnlichen weise gespeichert wird.

    Lange Rede kurzer Sinn:
    - Speichert List zufällig im HEAP?
    - Kann man dann List anständig mit NEW benutzen oder giebt es eine sinnige Alternative?
    - Verliert man dann die Benutzung des list<>::Iterators für das NEW-Objekt?

    Eine Erzeugung einer Liste mit NEW bekomm ich irgendwie nicht zufriedenstellend hin und weiss auch nicht ob das so legal ist. Außerdem wär ja auch die Verwendung des Iterators ne nützliche Sache aber auch da hab ich keine Ahnung wie das mit NEW (z.B.) zu händeln wär.

    Und entschuldigt bitte, dass kein Code änhängt aber ich habe bislang nur quer durch die Bank rumprobiert und mir die "Verbote" von CB angeschaut. Ich würd mich übrigens auch schon über den einen oder anderen Link freuen.

    Gruß
    ZwölfFufzig



  • ZwölfFufzig schrieb:

    - Speichert List zufällig im HEAP?

    Der Default-Allocator wird wohl im Heap speichern.

    ZwölfFufzig schrieb:

    - Kann man dann List anständig mit NEW benutzen oder giebt es eine sinnige Alternative?

    Hä?

    ZwölfFufzig schrieb:

    - Verliert man dann die Benutzung des list<>::Iterators für das NEW-Objekt?

    Hä?

    Also std::list nutzt man so:

    struct A
    {
    };
    
    int main()
    {
      std::list<A> l;
      l.push_back(A()); // Jetzt ist ein A in der Liste
      l.push_back(A()); // Noch eins
    
      auto it = l.begin(); // Iterator?
    }
    

  • Mod

    ZwölfFufzig schrieb:

    Ich habe mich seit neustem intensiver mit den std's auseinandergesetzt

    😮 Geschlechtskrankheiten?

    😃

    und für meine Belänge in Fragen "ungestackte Variablenmengen" bin ich an der schönen Templateklasse (korrigiert mich ruhig)

    Klassentemplate. Template ist englsich für Vorlage. List ist die Vorlage für eine Klasse, keine Klasse von Vorlagen.

    Das genaue Problem was ich im Moment habe und worüber ich nur begrenzt deutsche inhalte finde ist die Frage wie genau Ein std::list-Objekt gespeichert wir, bzw. wo.

    Eine List hat die lgeichen Eigenschaften wie jedes Objekt (außer Arrays und Klassen in denen der Autor mit Absicht irgendwas komisches treibt). Das heißt es liegt da, wo du es erzeugt hast, das heißt in der Regel im automatischen Speicher (aber prinzipiell kann man eine List auch dynamisch erzeugen, was aber in der Regel eher sinnlos ist). Die List kann (und wird) jedoch noch selber dynamisch Speicher anfordern, um darin ihren Inhalt zu speichern.

    Ich wünsche mir z.B. eine Erzeugung in einem Klassenkonstruktor aber ich weiss momentan nicht einmal ob die Liste nun nur im Kontruktoraufruf existiert und danach zerstört wird

    Kommt eben drauf an, was genau du machst. List verhält sich wie jeder andere Datentyp (außer Arrays) auch. Kennst du die Antwort für einen, kennst du die Antwort für alle. Kann es sein, dass dir dies bei anderen Typen ebenfalls unklar ist?

    Lange Rede kurzer Sinn:
    - Speichert List zufällig im HEAP?

    Ihren Inhalt in der Regel ja. Aber das kann man mittels des Allocator-Templateparameters anpassen. Per Default ist der Allocator (über ein paar Umwege) new. Die Liste selber (also die Verwaltungsdaten) liegt da, wo sie erzeugt wurde.

    - Kann man dann List anständig mit NEW benutzen oder giebt es eine sinnige Alternative?

    Es macht in der Regel wenig Sinn eine List (oder irgendeinen anderen Container der STL) mit new zu erzeugen, aber ja, prinzipiell ist das möglich. Vermutlich weißt du aber nicht, was du tust. Gerade als Anfänger solltest du es als Fehler ansehen, wenn du meinst, dass du irgendwofür new benötigst.

    - Verliert man dann die Benutzung des list<>::Iterators für das NEW-Objekt?

    😕

    Eine Erzeugung einer Liste mit NEW bekomm ich irgendwie nicht zufriedenstellend hin und weiss auch nicht ob das so legal ist.

    Was hast du genau gemacht? Ohne Code kann man keine Fehler finden.



  • Oha, danke für die Schnelle und ausführlichem Antworten!
    Zu meinen Fragen: 😃
    Ich schau morgen erneut rein und setze das hier fort.

    PS. Ich hab aber garkeine Geschlechtskrankheiten. 😋
    Ich meinte STL. ^^


Anmelden zum Antworten