C++中的范围和返回值

Ant*_*oCS 25 c++ scope return-value

我将重新开始使用c ++并考虑变量的范围.如果我在函数内部有一个变量然后我返回该变量,那么当它返回时变量不会"死",因为它所在的范围已经结束了?

我用函数返回一个字符串尝试了这个,它确实有效.有谁能解释一下?或者至少指出一些可以向我解释的地方.

谢谢

CMS*_*CMS 44

当函数终止时,会发生以下步骤:

  • 函数的返回值被复制到为此目的放在堆栈中的占位符中.

  • 弹出堆栈帧指针后的所有内容.这会破坏所有局部变量和参数.

  • 返回值从堆栈弹出,并被指定为函数的值.如果函数的值未分配给任何内容,则不会进行任何赋值,并且该值将丢失.

  • 执行的下一条指令的地址从堆栈中弹出,CPU在该指令处恢复执行.

堆栈和堆

  • 标准C++没有堆栈的概念. (3认同)
  • @CMS我很好奇C++标准中是否有支持此语句的部分?据我所知,有关堆栈的信息通常是特定CPU架构的调用约定的一部分,并且对于每个可用平台不必相同. (3认同)

Jas*_*oco 6

这实际上取决于您返回的变量类型。如果返回一个原语,那么它是通过复制而不是通过引用返回的,因此该值被复制到堆栈顶部(或者更常见的是放入寄存器中),调用函数可以在其中获取它。如果您在堆上分配一个对象或内存并返回一个指针,那么它不会消亡,因为它位于堆上,而不是堆栈上。但是,如果您在堆栈上分配某些内容并返回它,那将是一件坏事。例如,其中任何一个都会非常糟糕:

int *myBadAddingFunction(int a, int b)
{
    int result;

    result = a + b;
    return &result; // this is very bad and the result is undefined
}

char *myOtherBadFunction()
{
    char myString[256];

    strcpy(myString, "This is my string!");
    return myString; // also allocated on the stack, also bad
}
Run Code Online (Sandbox Code Playgroud)