私は C++ に少し慣れていないので、文字列ポインターの質問について助けを求めています。
まず、整数を使用したポインターの基本について考えてみましょう。
void SetBob(int* pBob)
{
*pBob = 5;
}
int main(int argc, _TCHAR* argv[])
{
int bob = 0;
SetBob(&bob);
}
実行すると、main() は整数を作成し、そのアドレスを SetBob に渡します。SetBob では、(pBob が指すアドレスの) 値は 5 に設定されます。SetBob が戻ると、bob の値は 5 になります。
では、文字列定数について考えてみましょう。
typedef wchar_t WCHAR;
typedef const WCHAR *PCWSTR;
void SetBob(PCWSTR* bob)
{
*bob = L"Done";
}
int main(int argc, _TCHAR* argv[])
{
PCWSTR bob = L"";
SetBob(&bob);
}
実行すると、main() は空の文字列を指す PCWSTR を作成し、そのアドレスを SetBob に渡します。SetBob では、PCWSTR ポインタが Done 文字列を指すようになりました。SetBob が戻ると、bob の値は "Done" になります。
私の質問は次のとおりです。
- デバッガーでは、SetBob を呼び出した後、bob 文字列が Done に設定されていることがわかります。しかし、なぜこれが機能するのでしょうか。整数の例では、整数にスペースを割り当てたので、そのスペースに値を格納できることは理にかなっています。ただし、文字列の例では、PCWSTR は単なるポインターです。文字列定数もメモリ内にあるという考えはここにあるので、その定数を指しているだけですか?
- "Done" リテラルは SetBob 内にあるため、それを指しているにもかかわらず、"Done" のメモリが再利用される可能性があることを心配する必要はありますか? たとえば、WCHAR バッファーを作成した場合、"Done" をバッファーにコピーするので問題ありません。しかし、私は関数内のリテラルを指しているので、そのリテラルは関数が終了した後のある時点で破棄され、bob が予期せず何も指していない可能性がありますか?