2010-12-07 17 views
4

Um einen ganzzahligen Wert an SetWindowTextW() zu übergeben (ich verwende einen Unicode-Build in C++ mit Visual Studio 2010), würde diese Funktion ausreichen, um einen LPCWSTR zurückzugeben? Ich bin mir ziemlich sicher, dass es etwas gibt, was ich hier nicht verstehe, weil es einen merkwürdigen Wert zurückgibt. Ich weiß, dass ein LPCWSTR eine leere lange Zeichenkette mit langem Zeiger ist, aber ich denke immer noch, dass mir etwas fehlt !?LPCWSTR von einer Funktion zurückgeben?

const LPCWSTR int2LPCWSTR (int integer) 
{ 
wstringstream wss; 
wss << integer; 
const wstring& wstr = wss.str(); 
const LPCWSTR p = wstr.c_str(); 
return p; 
} 

Antwort

8

passieren Es ist nichts falsch an sich mit einer LPCWSTR aus einer Funktion zurückkehrt. Das allgemeine Problem, das auftritt, ist jedoch die Speicherverwaltung um den Rückgabewert herum. A LPCWSTR wird normalerweise im zugewiesenen Speicher gehalten, so dass der Besitz dieses Speichers zwischen dem Anrufer und dem Angerufenen verstanden werden muss.

Ich möchte nicht auf Ihre Probe, aber es ist ein gutes Beispiel dafür, was schief gehen kann mit der Rückgabe einer LPCWSTR. Der Speicher für die Zeichenfolge wird von der Instanz wss gehalten, die für die Funktion lokal ist. Sobald die Funktion zurückkehrt, wird der Speicher im Destruktor wss freigegeben und somit der Rückgabewert ungültig gemacht.

Wenn Sie bereits verwenden C++ mein recomendation nur wäre die std::string oder wstring direkt zurückzukehren, um die Verwirrung zu beseitigen, die den zugewiesenen Speicher besitzt.

Oder wenn das Kopieren des Werts um ein Problem ist, geben Sie es als Referenz zurück.

void int2LPCWSTR (int integer, wstring& value) 
{ 
wstringstream wss; 
wss << integer; 
value = wss.str(); 
} 
0

Der Rückgabewert von .c_str() wird durch wstr gehört. Wenn wstr am Ende der Funktion zerstört wird, wird p ein ungültiger Zeiger.

0

LPCWSTR ist ein Zeiger zu einer Reihe von wchar_t s. Sie geben einen Zeiger zurück, der auf eine lokale Variable verweist (wss) - eine Variable, die nicht existiert, nachdem Ihre Funktion zurückkehrt. Also bedeutet dein Zeiger nichts und zeigt auf Müll.

Sie sollten stattdessen eine std::wstring zurückgeben, da es die Zeichenfolgedaten nicht nur einen Zeiger enthält.

Etwas wie: obwohl

std::wstring int2LPCWSTR (int integer) 
{ 
wstringstream wss; 
wss << integer; 
return wss.str(); 
} 

[Bearbeiten], ich persönlich würde dies mit _itow tun() aus Performance-Gründen wie Simon Mourier vermuten läßt.

+0

Also wie könnte ich es ändern, um stattdessen ein Wstring zurückzugeben? Kann dieser Wert dann an SetWindowTextW() übergeben werden oder muss ich die .c_str() davon nehmen? – rem45acp

+0

können Sie die Funktion verwenden, die ich eingefügt habe. und Sie sind richtig - dann nehmen Sie einfach die. C_str() von diesem Rückgabewert. Da std :: string/std :: wstring im Allgemeinen die gesamte Speicherverwaltung von Zeichenfolgen abstrahiert, wird sie standardmäßig in Ihrem Code verwendet und wird nur behandelt.c_str() - oder c-style-Strings im Umgang mit externen Dingen, die nicht mit std :: string umgehen können. – tenfour

+0

Vielen Dank für Ihre Hilfe! – rem45acp

2

Sie können nicht.
Return wstring und dann c_str() LPCWSTR zu bekommen verwenden und es zu SetWindowTextW

0
LPWSTR int2LPCWSTR(const int & v) 
{ 
    LPWSTR buffer = new wchar_t[100]; 
    _itow_s(v, buffer, 100, 10); 
    return buffer; 
} 
+0

Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, um die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. –

Verwandte Themen