【プログラム】一時変数の寿命って意外とひっかかるよね
基本的なことなのですが、うっかりミスりました。
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
(色々処理)
vector
vector
(色々処理) // 色々やってるうちに、test内に余分なメモリが増える
{
// test中の必要な分だけのメモリを確保してtestの中身をコピー。
vector
// testの中身を、無駄なメモリのないtempと入れ替え
temp.swap(test);
}