Effekt bei string
-
Ich wollte mal wissen, warum ich bei folgendem Sachverhalt ne Speicherverletzung bekomme:
string *text; text=(string*)malloc(10*sizeof(string)); string[3]="bla"; //Fehler hier
aber bei folgendem Ausdruck nicht
string *text; text=new string[10]; string[3]="bla";
-
Weil bei malloc keine Konstruktoren aufgerufen werden.
-
Das ist alles?
-
Klar, string verwendet intern ein char* pointer der dynamisch allokiert wird, was unter anderem im Konstruktor passiert. Ohne den Konstruktor - Aufruf zeigt dieser Pointer ins Nirvana
-
Was willst du denn noch hören? Dass der Zuweisungsoperator wie alle Memberfunktionen nur auf konstruierte Objekte aufgerufen werden darf?
-
Danke, das wars dazu erstmal.
Kann ich den Konstruktor nachträglich irgendwie aufrufen?
-
Ist übrigens auch mit ein Grund warum man auf malloc in C++-Programmen verzichten sollte!
-junix
-
Ja, brauche aber ne realloc Möglichkeit, die ich mir gerade mit new und delete selberschreibe.
-
Über placement-new:
string * foo = static_cast<string*>(malloc(10 * sizeof(string)); for (int i = 0; i < 10; ++i) new (foo + i) string; // konstruieren //... for (int i = 9; i >= 0; --i) foo[i].~string(); // umgekehrt zerstören free(foo);
Ich seh aber nicht im geringsten, warum man nicht einfach new/delete benutzen sollte.
-
Wenn du dein Array vergrößern/verkleinern willst, dann schau dir mal
die Klassen vector oder list an.
-
@Taurin
Danke sehr, die kommen aber nicht in frage.@Bashar
Ich habe mich jetzt für new/delete entschieden.
Ich war bisher nur zu faul, mir nen eigenes realloc dafür zu schreiben.
-
Warum kommt vector nicht in Frage? Und wie soll das realloc aussehen? BTW würde es dich sehr unglücklich machen, wenn ich sagte, dass ich noch nie realloc benutzt habe?
-
Also, der Vector kommt nicht in Frage, da er zu langsam ist, wenn viel reallociert wird. (wurde auch im Forum schon besprochen)
Das realloc brauche ich, damit ich meine Speicherstruktur auf die jeweiligen Bedürfnisse anpassen kann.
Wenn Du bisher ohne realloc oä ausgekommen bist, frage ich mich, wie du das angestellt hast.
-
Und das hast du gemessen?
-
Nein, es wurde hier mal angesprochen (ca 3 Wochen her).
-
http://www.c-plusplus.net/forum/viewtopic.php?t=51982&highlight=realloc
realloc kannst du aber wirklich nicht verwenden, wenn du mit std::strings arbeiten willst
-
daishi schrieb:
Also, der Vector kommt nicht in Frage, da er zu langsam ist, wenn viel reallociert wird. (wurde auch im Forum schon besprochen)
Dann nimm doch list
Das realloc brauche ich, damit ich meine Speicherstruktur auf die jeweiligen Bedürfnisse anpassen kann.
Wenn Du bisher ohne realloc oä ausgekommen bist, frage ich mich, wie du das angestellt hast.realloc macht auch nicht viel anderes als ein Vector. Wenn du viel hinzufügen willst, empfielt sich eine Liste.
realloc kannst du vergessen, man kann es nicht vernünftig mit Klasse verwenden!
Es ist auch unnötig, da realloc sowieso nicht zaubern kann - ein umkopieren wird meistens sowieso nötig sein.
-
@Shade Of Mine
Bei list fehlt mit die [] Möglichkeit.Ich habe jetzt eine andere Möglichkeit gefunden, die ist zwar C und nicht ganz so schön wie ich wollt, aber sie funktioniert.
-
omg
-
Ich weiss echt nicht, was du programmierst, aber:
Also, der Vector kommt nicht in Frage, da er zu langsam ist, wenn viel reallociert wird. (wurde auch im Forum schon besprochen)
Aber std::string verwenden ?
Das mit dem Reallociren must halt nur kontrollieren, und ned dem vector selber ueberlassen ... wenn das tust, sollt der vector nur marginal langsamer sein ... wenn ueberhaupt (je nach STL Implementation)
Die diskussion ob vector resize versus manuall new[] delete[] schneller ist, sollt man nur fuehren, wenn man echtzeit programme schreibt, oder wirklich zeitkritische Sachen tut, beispielsweise DX Anwendungen schreibt.
Wurd aber auch alles in dem Thread besprochen ...Naja, vielleicht arbeitest du ja grad an nem PixelshaderWrapper, der koordinaten in strings(std::string) entgegennimmt :p
Ciao ...