Frage zu string to char*
-
Dann würde ich den Text aber nicht jedesmal aus einer Datei lesen, sondern nur einmal und dann irgendwo im Speicher halten und einen Zeiger auf diesen string zurückgeben. Dann brauchst du ihn nicht immer neu anlegen und wieder löschen.
Dieses Post enthält vertrauliche und/oder rechtlich geschützte Informationen. Wenn Sie nicht der richtige Adressat sind oder dieses Post irrtürmlich erhalten haben, informieren Sie bitte sofort den Absender und vernichten Sie dieses Post. Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieses Posts ist nicht gestattet.
-
char *Wert_Ermitteln1(std::string const& search, const char* file_name) { std::ifstream file_stream(file_name); if (!file_stream) return NULL;if (std::string::npos != buf.find(search, 0))=> std::size_t ist nicht negativ! usw. ... dein Code ist eine Ansammlung von Fehlern ...
-
ruirui schrieb:
Nein es muss char* sein...
Wenn Du in einer Funktion unbedingt dynamisch ein char-Array anlegen willst, das Du ausserhalb brauchst, bleibt Dir nicht Anderes übrig, als das Löschen auch außerhalb anzustoßen. Schließlich gibt's bei der Entscheidung, ob der Speicher noch gebraucht wird, keinen Kompromiss.
Das kannst Du quick&dirty erledigenvoid nutzendeFunktion() { char * arr = Wert_Ermitteln1(search, datei); WINAPI_Funktion_die_charArray_braucht(arr); delete[] arr; }... oder mit allem möglichen Tricks wie
class Aufraeumer { std::vector<char*> arrays; public: void add(char* neuesArray) { arrays.push_back(neuesArray); } ~Aufraeumer() { std::vector<char*>::const_iterator it = arrays.begin(); while(it != arrays.begin()) { delete[] *it; ++it; } } }; // ACHTUNG: Nicht Threadsafe !!! static Aufraeumer aufraeumer; char *Wert_Ermitteln1(string search, char *datei) { // ... Restkram char *ary = new char[wert.length()+1]; aufraeumer.add(ary); return ary; }... oder smartpointer (falls die Schnittstelle das hergibt) ... oder sonstwie.
Aber letztlich bleibt's: Wird's außerhalb gebraucht, muss es außerhalb gelöscht werden.
Gruß,
Simon2.
-
Gib eine Kopie von std::string zurück, pack diese per Konstruktor in einen char-vector und übergibt dann per &vec[0] einfach den entsprechenden char-Zeiger. Fertig!

-
Also std::vector<char*> und so n Kram brauchst du nicht.
Wegen des tollen Spamfilters gibts den Code hier
http://rafb.net/p/M2uxBY76.html
-
du hast da ja auch nix von der Problematik drin ... nur einen anderen Lösungsvorschlag für das Ausgangsproblem ... der war aber, soweit ich weiß, nicht gefragt ...
-
string to char* ist drin und wie es richtig gelöscht wird (das einfügen in die map sollte eigentlich in den Konstruktor, sonst wird immer wieder gemacht).
was für eine Problematik denn sonst?
-
Um einen "LPCSTR" an eine Win-API Funktion zu übergeben, einfach "string::c_str()" verwenden:
std::string s = get_string(); MessageBox(..., s.c_str(), ...);Und nur, wenn wirklich ein nicht-konstantes Char-Array benötigt wird, sollte man dieses bereitstellen und dafür kann man ja dann ideal vector<char>(x) benutzen.
Warum immer noch von Hand mit char-arrays hantiert wird, kann ich einfach nicht verstehen...
-
Th schrieb:
Warum immer noch von Hand mit char-arrays hantiert wird, kann ich einfach nicht verstehen...
Weil diese Personen kein C++ können.
-
Vielleicht sollte man dann noch ein Pseudo-C++ Forum hier erzeugen, in der die ganzen Threads dann verschoben werden können

-
Th schrieb:
Vielleicht sollte man dann noch ein Pseudo-C++ Forum hier erzeugen, in der die ganzen Threads dann verschoben werden können

Nö, man sollte dem Threadsteller klipp und klar sagen (wie inzwischen ja auch geschehen ist), dass er definitiv kein
char*braucht sondern mitstringbestens bedient ist.
-
Sorry, Konrad, hast du wohl meine Ironie nicht verstanden?
Ich selber hatte ja den Hinweis auf string::c_str() gebracht.
-
Th schrieb:
Sorry, Konrad, hast du wohl meine Ironie nicht verstanden?
*g* doch, schon. Aber ich wollte nicht, dass da noch jemand auf dumme Gedanken kommt. (Nö, die Gefahr bestand nicht. Trotzdem …)
-
Th schrieb:
Ich selber hatte ja den Hinweis auf string::c_str() gebracht.
Was er schon von Anfang an hatte.

-
so schrieb:
Th schrieb:
Ich selber hatte ja den Hinweis auf string::c_str() gebracht.
Was er schon von Anfang an hatte.

… aber an der falschen Stelle.
-
dann bringt es aber nix die methode nochmal zu nennen