std::vector nicht von Anfang an leer?



  • Hallo,

    ich habe bemerkt, dass std::vector-Objekte wohl nicht immer von Anfang an leer sind. Erstelle ich in einem Programm einen vector und fülle ihn, dann ist er, wenn ich das Programm erneut starte, schon von Anfang an gefüllt... zumindest manchmal.
    Ist das richtig so? Falls ja, warum sorgt der Konstruktor nicht dafür, dass das Objekt leer erzeugt wird?



  • Hallo,
    wenn du einen std::vector über den Konstruktor der nur einen Allokator erwartet erzugst, dann ist danach immer garantiert, dass die Bedingung vec.size() == 0 erfüllt ist.



  • es ist natürlich gut möglich das bei mehrfachen starten eines programmes nacheinander der vector am selben ort auf dem heap zu liegen kommt... ansich sorgt der konstruktor dafür, dass er leer ist. aber etwa der [] operator macht ja kein range checking und dann wird einfach auf speicher zugegriffen der vom vector vielleicht sogar schon reserviert ist und er enthält sogar sinnvolle daten (vom letzten mal).
    ist nur so ne überlegung im konkreten fall kann das natürlich irgendwie rauskommen 🙂



  • Danke! Es war schon so, dass auch die "size"-Methode einen Wert ungleich null lieferte... was ist denn, wenn ich einen vector ganz ohne Parameter im Konstruktor erzeuge, also so:

    std::vector<int> test;

    Wird dann nicht garantiert, dass er leer ist?



  • Bei den Container requirements steht eindeutig, das size nach konstruieren 0 ist.
    Meinst du vielleicht capacity?



  • Nein, es war schon "size"...
    Das Ganze findet in einem Plug-In für 3ds max statt... vielleicht hat es damit was zu tun... wenn das Plug-In mehrfach aus dem Programm hintereinander aufgerufen wird, passiert es.



  • strange
    wenn du den vektor am anfang mit vector<int> test(0,0); initialisierst auch?
    das wäre dann ja gleichbedeutend mit einem fehlenden konstruktoraufruf...



  • Wenn es ein Plugin ist, ist es wohl keine normale EXE, sondern eine DLL, oder? Die wird wohl einfach einmal geladen und danach weiterverwendet. Wo und wie erstellst du denn den Vektor?



  • Ja, es ist eine DLL. Der vector wird global deklariert...


Log in to reply