0

文字列が関数で定義されている場合、呼び出し間でその値を保持しますか?

このようなもの :

std::string myFunction( std::string input)
{
    std::string output;

    for ( int i=0; i < input.length(); i++ )
    {
        output[i] = input[i];
    }

    return output;

}

関数への最初の呼び出しでの入力文字列の長さが2番目の呼び出しでの入力の長さよりも長い場合、2番目の呼び出しで返される文字列には、前の呼び出しの最後の数文字(長さの差と同じ)が残ります。無傷。

4

2 に答える 2

2

文字列が関数で定義されている場合、呼び出し間でその値を保持しますか?

明確に定義されたコードでは、宣言されていない限り、そうではありませんstatic

現在の実装の主な問題は、ループの本体です。

for ( int i=0; i < input.length(); i++ )
{
    output[i] = input[i];
}

ここでは、未定義の動作outputであるの終わりを超えて割り当てています。未定義の動作の領域に入ると、何でも起こり得ます。

于 2012-12-16T08:12:16.783 に答える
1

そうではありません。文字列はヒープを使用するため、他のすべてのローカル変数ではなく、文字列についてこれを尋ねると思います。そうですが、文字列にはデストラクタもあります。デストラクタは、スコープを終了するときに呼び出され、使用したヒープの割り当てを解除します。

もちろん、その値を保持していることに気付くかもしれませんが、それは同じメモリ領域を再度割り当てることの偶然です(プログラム、メモリ環境、コンパイラなどによっては、何度も発生する可能性があります)。

于 2012-12-16T08:59:33.197 に答える