0

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

像这样的东西:

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

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

    return output;

}

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

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

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

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

于 2012-12-16T08:59:33.197 回答