mit 'new' weiteren Speicher anhängen



  • Hallo,

    ich habe im FAQ-Archiev zum Thema 'new' leider nicht ganz das gefunden was ich brauche.

    Undzwar möchte ich für einen Pointer mit 'new' Speicher allokieren und später diesen Speicher mit 'new' erweitern, also quasi so ähnlich wie mit 'push_back' bei Vektoren. Wie macht man das mit 'new' ohnen den bisherigen Inhalt des Pointers zu löschen?



  • Das geht nicht.



  • Wie würdest du das denn machen? Ich brauche auf alle Fälle einen Pointer.



  • Mach es doch so wie vector:

    Beleg neuen Speicher der so groß ist wie die brauchst und kopier den alten rein. Dabei musst du natürlich beachten das alles Pointer die in den alten Speicherbereich reichen dadurch ungültig werden.



  • So macht das std::vector nicht.



  • In Ordnung, aber wie kopiere ich die Werte des alten, kleineres Pointers in den neuen, größeren Pointer?
    Ich kann diese ja nicht einfach mit einem '=' gleich setzen?!



  • Erstmal garnicht. Du kannst nicht beeinflussen, welchen Speicher dir der standard- operator new liefert. vector macht es so, dass er zum Anhaengen einen neuen Block speicher anfordert, der groesser ist als der alte, die Objekte vom alten in den neuen Speicherblock kopiert und entsprechend am Ende den freien Speicher am Ende des neuen Blocks mit weiteren Objekten belegen kann. Danach wird der alte Speicher dann freigegeben und die enthaltenen Objekte (die ja rueberkopiert wurden) geloescht.
    Viel andere Moeglichkeiten gibt es nicht, da es ja gut moeglich ist, dass der Speicher hinter deinem vorhandenen Speicher schon belegt ist. Der jeweilige Besitzer waere nicht serh erbaut, wenn du seinen Speicher fuer dich beanspruchst und vollschreibst ("nicht sehr erbaute" Programme stuerzen ab, werfen dir einen Core-Dump vor die Fuesse und/oder zeigen undefiniertes Verhalten...)



  • kleineres Pointers in den neuen, größeren Pointer?

    Pointer sind pro Maschine und OS immer gleich gross.



  • simon.gysi schrieb:

    Pointer sind pro Maschine und OS immer gleich gross.

    Soll das heißen ich soll wirklich schreiben: "pNew = pOld;" ?



  • Nöö ... es bezog sich eher auf die aussage "kleinere" und "größerer" Zeiger, denke ich.
    Nimm std::copy (Header: Algorithm) oder notfalls kopier von Hand per Schleife.



  • (D)Evil schrieb:

    So macht das std::vector nicht.

    Nicht? Sondern?



  • LukasBanana schrieb:

    Wie würdest du das denn machen? Ich brauche auf alle Fälle einen Pointer.

    std::vector<char> mem(10);
    mem.resize(20);
    char* ptr = &mem[0];
    


  • (D)Evil schrieb:

    So macht das std::vector nicht.

    wie denn dann? oder willst du nur darauf hinaus, dass std::vector evtl. mehr speicher als direkt benötigt wird reserviert?



  • std::copy dient zum kopieren von Vektoren und eine for-Schleife ist mir zu langsam. Gibt`s da denn keine andere möglichkeit? Wie genau funktioniert das denn in der Klasse 'Vektor'? Die arbeitet doch intern auch mit Pointern oder?



  • LukasBanana schrieb:

    std::copy dient zum kopieren von Vektoren und eine for-Schleife ist mir zu langsam. Gibt`s da denn keine andere möglichkeit? Wie genau funktioniert das denn in der Klasse 'Vektor'? Die arbeitet doch intern auch mit Pointern oder?

    wieso zu langsam? wie hast du das gemessen?
    wie willst du denn bitte ohne schleife x > 1 elemente von a nach b bewegen?



  • Naja, wenn man in einem Vektor über 10000 Werte gespeichert hat, dann ist eine solche for-Schleife nicht gerade schnell oder? Und Vektor ist meines Erachtens beim hinzufügen von Elementen shr schnell.



  • Kannst natürlich auch memcpy benutzen, wenn du denn das Geheule der "bloß kein C"-Fraktion ertragen kannst. 😉 :p 😃

    Und std::copy ist nicht nur für Vektoren. Geht auch für Arrays jeglichen Typs.



  • ? Was soll an einer Schleife langsam sein? Nimm halt std::memcpy ... aber damit bekommst du Probleme ... von d.h. was spricht gegen std::copy?

    wie denn dann? oder willst du nur darauf hinaus, dass std::vector evtl. mehr speicher als direkt benötigt wird reserviert?

    korrekt!



  • LukasBanana schrieb:

    Naja, wenn man in einem Vektor über 10000 Werte gespeichert hat, dann ist eine solche for-Schleife nicht gerade schnell oder? Und Vektor ist meines Erachtens beim hinzufügen von Elementen shr schnell.

    Ja, weil vector auch nur ganz ganz selten kopiert. Der Speicher wird nämlich immer gleich verdoppelt wenn er ausgeht. Dadurch passiert es nicht allzu oft, dass er überhaupt ausgeht. Wenn's aber passiert, dann bezahlst du das auch.



  • Fellhuhn schrieb:

    Kannst natürlich auch memcpy benutzen, wenn du denn das Geheule der "bloß kein C"-Fraktion ertragen kannst. 😉

    mit "geheule" meint unser freund hier wahrscheinlich die tatsache, dass memcpy nur für pod funktioniert und bei allem anderen jämmerlich verreckt.
    das kann man natürlich ignorieren - wenn man dumm ist.



  • ... oder es ausreicht. 🙄


Anmelden zum Antworten