Merkwürdiges Verhalten eines LPCWSTR -> Falscher Typ?
-
Hallo zusammen,
ich weiß, dass gerade ein ähnliches Thema in einem anderen Thread behandelt wird (wobei mir die Diskussion nicht direkt weitergeholfen hat), allerdings bekomme ich keinen Compilerfehler sondern meine Applikation verhält sich nicht wie (von mir) erwartet.
ich habe die folgende Klasse:
#include <windows.h> #include <string> class TestClass { public: LPCWSTR var1 = NULL; LPCWSTR var2 = NULL; TestClass::TestClass() {} TestClass::~TestClass() {} void TestClass::Read() { MessageBox(NULL, this->var1, L"read var1", MB_OK); std::cout << "read var1: " << this->var1 << std::endl; MessageBox(NULL, this->var2, L"read var2", MB_OK); std::cout << "read var2: " << this->var2 << std::endl; } void TestClass::Write() { MessageBox(NULL, this->var1, L"vorher var1", MB_OK); std::cout << "vorher var1: " << this->var1 << std::endl; MessageBox(NULL, this->var2, L"vorher var2", MB_OK); std::cout << "vorher var2: " << this->var2 << std::endl; const std::wstring mywstring = L"Inhalt var1 bzw. mywstring"; this->var1 = mywstring.c_str(); this->var2 = L"Inhalt var2"; MessageBox(NULL, this->var1, L"nachher var1", MB_OK); std::cout << "nachher var1: " << this->var1 << std::endl; MessageBox(NULL, this->var2, L"nachher var2", MB_OK); std::cout << "nachher var2: " << this->var2 << std::endl; } };
Nach instantiierung eines Objekts rufe ich zuerst die Methode Write() auf und anschließend Read(). Die Ausgabe am Ende von Write() ergibt für var1 und var2 die jeweils von mir erwartete Ausgabe.
In Read() jedoch ergibt nur die Ausgabe von var2 das erwartete Ergebnis. var1 enthält Datenmüll (?). Die Speicheradressen sind allerdings logischerweise identisch zur Ausgabe in Write();Kann mir hierfür jemand eine Erklärung oder einen Tipp geben?
viele grüße
-
Ich schätze, dass die Adresse, die mywstring.c_str() zurückgibt, zusammen mit mywstring am Ende von Write ungültig wird.
-
Ja
LPCWSTR
ist halt nur ein Zeiger.Und als Zeiger zeigt der halt auf was. Er kann aber nicht automagisch dafür sorgen, dass das, worauf er zeigt, auch gültig bleibt.
Dafür musst du sorgen.Du sorgst aber gerade dafür dass es eben ungültig wird. Indem du den
std::wstring
, auf dessen Daten du dir die Adresse mit.c_str()
geholt hast, zerstörst.Ersetze die
LPCWSTR
doch einfach durchstd::wstring
.
Wieso meinst du überhauptLPCWSTR
verwenden zu wollen/müssen?
-
hustbaer schrieb:
Ersetze die
LPCWSTR
doch einfach durchstd::wstring
.
Wieso meinst du überhauptLPCWSTR
verwenden zu wollen/müssen?Danke euch, ich verwende nun tatsächlich std::wstring und übergebe diese mittels über die Methode c_str() an die Funktionen die einen LPCWSTR erwarten.