vector in map einfügen
-
Er nennt die Variable c_string, ich ging jetzt davon aus, dass er da String-Literale drin verwaltet?
-
decimad schrieb:
Du könntest aus dem vector per std::move noch eine rvalue referenz machen, dann wird das dazugehörige heap-array nicht kopiert.
Das versuche ich gleich direkt mal.
manni66 schrieb:
Ein const char* in einem Vector hat den Absturz schon fast eingebaut. Warum benutzt du nicht std::string?
Warum?
Ich bekomme Strings als const char* und möchte mir die Konvertierung zu std::string sparen.
-
Mit const char* zu hantieren ist fehleranfälliger als mit std::string - hängt von den Besitzverhältnissen ab.
-
uxji schrieb:
Ich bekomme Strings als const char* und möchte mir die Konvertierung zu std::string sparen.
Kannst du garantieren, dass die C-Strings solange gültig bleiben, wie du sie benutzt? D.h. irgendwo bleibt Speicher für sie allokiert?
-
uxji schrieb:
manni66 schrieb:
Ein const char* in einem Vector hat den Absturz schon fast eingebaut. Warum benutzt du nicht std::string?
Warum?
Ich bekomme Strings als const char* und möchte mir die Konvertierung zu std::string sparen.
Eben, du verwendest Zeiger, die wahrscheinlich ungültig sind, wenn du sie benutzt. Wie ich schon sagte: der Absturz ist schon eingebaut!
-
und die Ungültigkeit der Zeiger bekomme ich nur in den Griff, wenn ich n String drausmache?
-
manni66 schrieb:
uxji schrieb:
manni66 schrieb:
Ein const char* in einem Vector hat den Absturz schon fast eingebaut. Warum benutzt du nicht std::string?
Warum?
Ich bekomme Strings als const char* und möchte mir die Konvertierung zu std::string sparen.
Eben, du verwendest Zeiger, die wahrscheinlich ungültig sind, wenn du sie benutzt. Wie ich schon sagte: der Absturz ist schon eingebaut!
Woher willst du wissen, dass die Zeiger ungültig sind?
Wenn es da irgendeine Funktion gibt, die Zeiger zurückgibt, die garantiert gültig sind und bleiben, kann man sich die Kopie sparen.
-
uxji schrieb:
und die Ungültigkeit der Zeiger bekomme ich nur in den Griff, wenn ich n String drausmache?
Indem du dir über die Besitzverhältnisse im Klaren bist. Entweder du garantierst die Gültigkeit der Zeiger (was impliziert, dass die C-Strings irgendwo gespeichert sind und es auch bleiben) oder du nimmst
std::string, welcher selbst für sich schaut.
-
Nathan schrieb:
Woher willst du wissen, dass die Zeiger ungültig sind?
Wenn es da irgendeine Funktion gibt, die Zeiger zurückgibt, die garantiert gültig sind und bleiben, kann man sich die Kopie sparen.Ja, wenn. Und wenn es jetzt so ist, ist es morgen anders. Garantiert!
-
Nach kurzer Zeit (und vor allemw enn man nicht allein an dem Projekt arbeitet) und wenigen Änderungen da weiss keienr mehr, wem welcher Zeiger und welche Daten gehören.
Und wer löscht den Speicher auf den die Zeiger zeigen?
Aktuelles Beispiel:
Ich protiere grad etwas C Code nach C++: Der Kollege, der den C Code geschrieben hat, der hat in eienr Funktion am Anfang en char Array allokiert (~16000 Bytes) und beschreibt das munter immer wieder neu hin und her. Was am Anfang ein Dateiname war, stellt nun einen Pfad oder den Inhalt einer Datei dar. Alles sehr konfus.Mit Strings erstellst du dir erstmal einfahc immer ne neue Instanz, die genau für eine Aufgabe vorgesehen ist.
Optimieren kann man später noch. (In dem Fall unnötig, da es eine Init Funktion ist, die einmal beim Initialisieren einer Globalen Variable aufgerufen wird. [Die Globals stammen nicht von mir ;)])