【プログラム】一時変数の寿命って意外とひっかかるよね

基本的なことなのですが、うっかりミスりました。

LPTSTR lpszText = _T("TEST");
LPWSTR wText = CT2WEX(lpszText);

CT2WEXは文字変換クラスで、LPSTR形文字列をLPWSTR型文字列に変換するクラスです。細かい実装は省略。

で、
CT2WEX(lpszText)

というコードでは、lpszTextを初期化値として、CT2WEXクラスの一時オブジェクトを作成します。作成したオブジェクトを仮にconvertという名前にしましょう。

wText = convert;

CT2WEXでは、LPWSTR型へのキャスト演算子が定義されており、convertの内部で確保された文字列へのポインタが返ります。

しかし代入後、convertは破棄されます。次のコードと同じ動作になるわけですね。

LPWSTR wText;
{
CT2WEX convert(lpszText);
wText = convert;
}

convertは{}スコープを出ると破棄されますが、CT2WEXのLPWSTRへのキャストでは文字列のコピーがあるわけではないので、wTextに代入されたポインタは無効になります。

これに気づくのに1時間かかった私。何年プログラマやってんだかorz

蛇足ながら、stl::vectorのswap法なんても、わかりにくい時はさっきのコードみたいに展開すると理解しやすいですね。

vector test;
(色々処理)
vector(test).swap(test);

vector test;
(色々処理) // 色々やってるうちに、test内に余分なメモリが増える
{
// test中の必要な分だけのメモリを確保してtestの中身をコピー。
vector temp(test);

// testの中身を、無駄なメモリのないtempと入れ替え
temp.swap(test);
}