std::string, char *
-
Hallo,
ich habe einen Thread und übergebe diesen einen void *... Ich caste also meinen std::string(...).c_str() nach char *... Jedoch ist danach die Variable leer?Was kann ich tun? Rufe ich die Funktion direkt auf ohne std::string klappt es

Vielen Dank im Voraus!
-
c_str() legt einen *temporären Puffer an. Der ist dann ungültig, wenn er später verwendet wird...
Zeig mal bitte den passenden Code...
-
? wie willst du das denn machen? Castest du etwa das const weg? Böseböse ...
std::string foo; const char* bar = foo.c_str(); /*! BÖSE !*/char* dest = const_cast<char*>(bar);/*! BÖSE !*/std::string foo; std::vector<char> bar(foo.begin(), foo.end()); bar.push_back(0); char* dest = &bar[0];
schon eher
Aber du musst immer gucken das der Bereich auf den der Zeiger zeigt auch noch existiert!
-
CreateThread(NULL, NULL, messageBox, (void *)const_cast<char *>(request.c_str()), NULL, NULL);Klappt leider nicht -> Die Messagebox ist leider leer... Bin am Verzweifeln

-
Das geht wie gesagt so nicht... der Zeiger ist schon lange ungültig, wenn der Thread läuft...
Mach es so:
void MyThread(void *data) { char *pMsg = (char*) data; MessageBox(NULL, "", pMsg, MB_OK); free(pMsg); } void DisplayMsgBosInThread() { std::string s; s = "Hello world"; _beginthread(MyThread, 0, strdup(s.c_str())); }
-
Hilfe123 schrieb:
CreateThread(NULL, NULL, messageBox, (void *)const_cast<char *>(request.c_str()), NULL, NULL);Klappt leider nicht -> Die Messagebox ist leider leer... Bin am Verzweifeln

wenn 'request' nicht mehr existiert, wenn der thread startet, dann klappt das nicht. mach 'request' static oder global.

-
Apeman schrieb:
mach 'request' static oder global.
Sehr schlechte Idee...
static oder global geht nur in simplen Programmen...
-
Jochen Kalmbach schrieb:
Apeman schrieb:
mach 'request' static oder global.
Sehr schlechte Idee...
static oder global geht nur in simplen Programmen...gar nicht. ausserdem kann man's z.b. in eine critical section einpacken etc, damit's kein durcheinander mit dem thread gibt.

-
Das is ja mal wieder geil ^^ Ich sach extra er soll nicht const_cast nehmen und was macht er? Erstmal const wegkasten
Und dann nen C-Style-Cast auf void* ... GEIL!
-
Danke! Es klappt, aber folgende Warnung bereitet mir Sorgen:
warning C4996: 'strdup' wurde als veraltet deklariert
Meldung: "The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strdup. See online help for details."Das heißt? Was soll ich jetzt tun? Vielen Dank im Voraus!
-
Hilfe123 schrieb:
"warning C4996: 'strdup' wurde als veraltet deklariert"
Meldung: "The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strdup. See online help for details."
Das heißt? Was soll ich jetzt tun?Öhm, du darfst dir Warnungen auch gerne durchlesen

Du sollst tun: Use the name: '_strdup'
Begründung: 'strdup' wurde als veraltet deklariertFalls du des englischen nicht mächtig bist, schnell lernen! Und für den Anfang: "to use"->"benutzen", "name"->"Name"