メモリの位置について – プログラミング – Home

通知
すべてクリア

[解決済] メモリの位置について


こにゃんこ
 こにゃんこ
(@こにゃんこ)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

お世話になっております。

初歩的な質問で申し訳ありませんが、メモリについて教えてください。

以下の関数を実行した場合、戻り値はローカルメモリを使用しているので、
保証されません。

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 を使用しています。


引用未解決
トピックタグ
yoh2
 yoh2
(@yoh2)
ゲスト
結合: 18年前
投稿: 70
 

まず、_T(test)は、test または Ltestのいずれか (どちらも文字列
リテラル) に展開されるということを思い出しておいて下さい。

でもって、文字列リテラルは静的記憶期間を持ちます。要するに、
文字列リテラルはプログラムの初めから終わりまでずっと生きています。
そのため、関数が終わっても使えなくなることはありません。

ただし、文字列リテラルの型にはconstが付いていないのにもかかわらず、
その内容を変更してはならないことをお忘れなく。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

下二つのGetTextは実質的に同じで,
TCHAR * GetText()
{
static TCHAR __string__test[5] = _T(test);
return __string__test;
}
のような扱いになります。
# C++だとTCHARがconst TCHARになるはず。

staticなので,GetTextを抜けてもそのメモリへのアクセスは有効です。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

既に指摘されていますけれど、
書き換える必要が無いなら直接返してしまっても良いと思います。
それならば、const TCHAR* GetText()とするべきではないかなぁ。

ただ、C++的に書くのであれば、

const TCHAR* cnsttcTestText = _T(Test);

これをヘッダーファイルにでも定義しておいて

cosnt TCHAR* GetText()
{
  return cnsttcTestText;
}

とするのではないかなぁ。
まあ、ヘッダーファイルに定義するならわざわざ関数作って呼び出すようには
しないで直接 cnsttcTestTextを使うかもしれません。


返信引用
こにゃんこ
 こにゃんこ
(@こにゃんこ)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

返信ありがとうございます。
利用できるときは、使っていきたいとおもいます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました