2016-06-29 4 views
4

に読んでいただきありがとうございます。wchar_t *

私はこれに近いと思いますが、何かの試みが私が期待したとおりに実行していない理由を理解するために専門知識を使用することができます。

私が必要とするのは、実際にはVC++であるため長い型を変換することですが、これは単なる型定義であることが分かります。私が望む結果を得ることができますが、なぜ私は考えているアプローチがうまくいかないのか理解できません。私が利用したいと思いアプローチVsが

const std::wstring myString{ std::to_wstring(wRect.bottom) }; 
const wchar_t * myCharPointer{ myString.c_str() }; 

:ここで私が望む結果を達成したコードです

VSコミュニティでの私のデバッガを使用して
const wchar_t * lWind{ std::to_wstring(wRect.bottom).c_str() }; 

私は正しい値にmyCharPointerポイントと判断しました( "600")、lWindはnull文字列/空文字列を指すように割り当てられます(または、新しい割り当てが決して割り当てられません)。

これらの2つのアプローチの理論的なパフォーマンスの側面、すなわち2行のコードと2種類の変数を使用して、1行のコードと1行のコードの値に到達するのは興味があります。明らかに、これらのアプローチのそれぞれを実行するために呼び出されるいくつかのバックエンドコードがありますが、あるアプローチが他のアプローチよりもコストパフォーマンスが高いかどうかはわかりません。

私はこのことについてのフィードバックをいただきありがとうございます。私が達成しようとしている全体的な目標はもっと良い方法でさえ達成されるかもしれないが、今は私の好奇心を満足させたいと思う。ありがとう!

+1

実際には、数字の基数10表現を含む 'wchar_t'文字列を作成したいのですか?または何? –

+0

lWindを渡す関数にはwchar_t *パラメータが必要です。具体的には、DirectWriteライブラリのDrawText()関数です。私はDirectWriteライブラリを使ってデバッグオーバーレイとして動作しており、オーバーレイに表示されるテキストのwchar_t *パラメータを受け入れるデバッグオーバーレイ更新関数を設定しました。この特定のケースでは、DrawText()関数を使用してオーバーレイに表示される数値をリレーしようとしています。 このライブラリに精通している場合、または私が試していることを最適化する方法についての提案があれば、私は非常に多くの提案をすることができます! –

答えて

2

to_wstringは値によってwstringを返します。一時オブジェクトのデストラクタは、c_strを呼び出した後に呼び出され、次の行でスコープを失ってポインタが無効になります。

const wchar_t * lWind{ std::to_wstring(wRect.bottom).c_str() }; // after this line invalid pointer 

これは、wchar_tポインタの長さだけ存続する一時的な文字列を格納することで修正できます。

std::wstring ws = std::to_wstring(100); 

const wchar_t * lWind{ ws.c_str() }; 
+0

私はこれが事実かもしれないと考えました。確認していただきありがとうございます。トレースに沿ってフォローしようとしましたが、私はまだC++に精通しており、正確に何が起こっているのか把握できませんでした。 –

関連する問題