wchar_t Zeiger

8

Was ist falsch daran:

%Vor%

Ich dachte, ich könnte einen Zeiger wchar_t als String verwenden ...

    
Tony The Lion 24.06.2010, 17:33
quelle

6 Antworten

25

Ihr Code hat zwei Probleme.

Zunächst ist "Tony" ein Zeiger auf eine Zeichenfolge von char . L"Tony" ist die entsprechende breite Zeichenfolge.

Zweitens weisen Sie ein einzelnes wchar_t über new zu und verlieren sofort den Überblick, indem Sie den Zeiger Tony zuweisen. Dies führt zu einem Speicherverlust.

    
Michael 24.06.2010, 17:36
quelle
11

Ein Zeiger zeigt nur auf einen einzelnen Wert. Das ist wichtig.

Alles, was Sie getan haben, ist Platz für ein einzelnes wchar_t und zeigen Sie darauf. Dann versuchen Sie, den Zeiger so zu setzen, dass er auf einen String zeigt (denken Sie daran, nur an das erste Zeichen), aber der String-Typ ist falsch.

Was Sie haben, ist eine Zeichenfolge von char , die "sollte" L"Tony" sein sollte. Aber alles, was Sie hier tun, ist Ihre vorherige Speicherzuweisung zu verlieren, weil der Zeiger einen neuen Wert enthält.

Sie möchten vielmehr genügend Platz für die gesamte Zeichenfolge reservieren und dann die Zeichenfolge in den zugewiesenen Speicher kopieren. Dies ist jedoch eine schreckliche Praxis; Tue niemals etwas, das dich explizit Speicher freigeben muss.

Benutze einfach std::wstring und gehe weiter. %Code%. Es behandelt alle Details und Sie müssen sich keine Gedanken darüber machen, etwas zu säubern.

    
GManNickG 24.06.2010 17:39
quelle
5

Dies bedeutet, dass Sie zuerst einen Zeiger auf ein neu zugewiesenes wchar_t in t zuweisen und dann versuchen, eine nicht breite Zeichenfolge in t zuzuweisen.

Können Sie stattdessen std::wstring verwenden? Das wird alle Ihre Speicherverwaltung für Sie übernehmen.

    
Mark B 24.06.2010 17:37
quelle
5

Da Sie ein C # -Entwickler sind, werde ich auf einige Dinge hinweisen, die C ++ anders macht.

Dies weist ein neues wchar_t zu und ordnet es t

zu %Vor%

Dies ist ein Array von konstantem Zeichen

%Vor%

Um ein konstantes wchar_t-Array zu erhalten, setzen Sie es mit L voran

%Vor%

Damit wird t wieder auf die Konstante L "Tony" anstelle Ihres alten wchar_t ausgerichtet und verursacht ein Speicherleck, da Ihr wchar_t niemals freigegeben wird.

%Vor%

Dies erzeugt eine Reihe von breiten Zeichen (wchar_t), um eine Kopie von L "Tony"

zu halten %Vor%

Ich denke, die letzte Zeile ist was du willst. Wenn Sie Zugriff auf den Zeiger wchar_t benötigen, verwenden Sie t.c_str (). Beachten Sie, dass C ++ - Zeichenfolgen änderbar sind und bei jeder Zuweisung kopiert werden.

Der Weg dazu wäre

%Vor%

Dies erstellt keine Kopie und weist den Zeiger nur dem const wchar-Array

zu     
josefx 24.06.2010 18:00
quelle
0

Sie können, es ist nur, dass "Tony" ist eine fest codierte Zeichenfolge, und sie sind standardmäßig ANSI in den meisten Editoren / Compiler. Wenn Sie dem Editor mitteilen möchten, dass Sie eine Unicode-Zeichenfolge eingeben, geben Sie ihm den Präfix L, z. t = L"Tony" .

Sie haben andere Probleme mit Ihrem Code, Ihre Zuweisung weist ein einzelnes Unicode-Zeichen (2 Bytes) zu, dann versuchen Sie, die ursprüngliche Variable auf die konstante Zeichenfolge zu verweisen, wodurch diese 2 Bytes verloren gehen.

Wenn Sie einen Puffer aus Unicode-Daten erstellen und Daten darin platzieren möchten, tun Sie Folgendes:

%Vor%     
gbjbaanb 24.06.2010 17:39
quelle
-1

das ist völlig falsch. Es gibt keine Notwendigkeit, zwei Bytes zuzuweisen, machen Sie t, um auf sie zu zeigen, und überschreiben Sie dann den Zeiger, der den verlorenen Speicher für immer leckt.

Auch Tony hat einen anderen Typ. Verwenden Sie:

wchar_t *t = L"Tony";

IMHO besser wchars überhaupt nicht verwenden - Siehe Ссылка

    
Pavel Radzivilovsky 24.06.2010 17:35
quelle

Tags und Links