お世話になっております。
初歩的な質問で申し訳ありませんが、メモリについて教えてください。
以下の関数を実行した場合、戻り値はローカルメモリを使用しているので、
保証されません。
TCHAR* GetText()
{
TCHAR text[] = _T(test);
return text;
}
たとえば、以下のように記述した場合は戻り値は保証されるのでしょうか?
TCHAR* GetText()
{
return _T(test);
}
TCHAR* GetText()
{
#define TXT _T(test)
return TXT
}
上記の二つもローカルメモリに確保していて、関数の呼び出し終了後に
開放?されるのではないかと思っているのですが、ネットで検索しても
正しく動作する/動作しない などのそれっぽい記述を見つけることが
できませんでした。
すみませんが、回答お願いします。
開発環境によって変わるのかわかりませんが、
Visual Studio.NET 2003 を使用しています。
まず、_T(test)は、test または Ltestのいずれか (どちらも文字列
リテラル) に展開されるということを思い出しておいて下さい。
でもって、文字列リテラルは静的記憶期間を持ちます。要するに、
文字列リテラルはプログラムの初めから終わりまでずっと生きています。
そのため、関数が終わっても使えなくなることはありません。
ただし、文字列リテラルの型にはconstが付いていないのにもかかわらず、
その内容を変更してはならないことをお忘れなく。
下二つのGetTextは実質的に同じで,
TCHAR * GetText()
{
static TCHAR __string__test[5] = _T(test);
return __string__test;
}
のような扱いになります。
# C++だとTCHARがconst TCHARになるはず。
staticなので,GetTextを抜けてもそのメモリへのアクセスは有効です。
既に指摘されていますけれど、
書き換える必要が無いなら直接返してしまっても良いと思います。
それならば、const TCHAR* GetText()とするべきではないかなぁ。
ただ、C++的に書くのであれば、
const TCHAR* cnsttcTestText = _T(Test);
これをヘッダーファイルにでも定義しておいて
cosnt TCHAR* GetText()
{
return cnsttcTestText;
}
とするのではないかなぁ。
まあ、ヘッダーファイルに定義するならわざわざ関数作って呼び出すようには
しないで直接 cnsttcTestTextを使うかもしれません。
返信ありがとうございます。
利用できるときは、使っていきたいとおもいます。