在函数中定义的std :: string是否保留其先前的值?

时间:2012-12-16 08:07:52

标签: c++

如果在函数中定义了字符串,它是否在调用之间保留其值?

这样的事情:

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

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

    return output;

}

如果第一次调用函数时输入字符串的长度比第二次调用中输入的长度长,则第二次调用中返回的字符串仍然具有最后几个(长度差异相同)字符前一个电话完好无损。

2 个答案:

答案 0 :(得分:2)

  

如果在函数中定义了字符串,它是否在调用之间保留其值?

在明确定义的代码中它不会,除非它被声明为static

当前实现的主要问题是循环体:

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

在这里,您指定的是output的结尾undefined behaviour。一旦你处于未定义行为的境界,任何事情都可能发生。

答案 1 :(得分:1)

没有。我相信你问这个关于字符串而不是关于所有其他局部变量,因为字符串使用堆。这是正确的,但字符串也有一个析构函数,在从作用域退出时调用,释放它使用的堆。

当然,您可能会发现它确实保留了它的值,但这只是再次分配相同内存区域的巧合(这可能会一次又一次地发生,具体取决于您的程序,内存环境,编译器等。 )。