我重新开始学习C++,并思考变量的作用域问题。如果我在一个函数内部定义一个变量,然后返回该变量,那么当它被返回时,它不会因为其所处的作用域已经结束而“死亡”吗?
我尝试过编写返回字符串的函数,并且确实是有效的。有人能解释一下这个问题吗?或者至少指点我一下可以解释这个问题的地方。
谢谢
我重新开始学习C++,并思考变量的作用域问题。如果我在一个函数内部定义一个变量,然后返回该变量,那么当它被返回时,它不会因为其所处的作用域已经结束而“死亡”吗?
我尝试过编写返回字符串的函数,并且确实是有效的。有人能解释一下这个问题吗?或者至少指点我一下可以解释这个问题的地方。
谢谢
将函数的返回值复制到为此目的在栈上放置的占位符中。
弹出堆栈帧指针后的所有内容。这会销毁所有本地变量和参数。
弹出堆栈中的返回值,并将其分配为函数的值。如果函数的值未被分配给任何东西,则不进行分配,该值将丢失。
弹出要执行的下一条指令的地址,并使CPU在该指令处恢复执行。
这真的取决于你要返回哪种类型的变量。如果你返回一个原始类型,它会被复制而不是按引用返回,因此该值会被复制到堆栈顶部(或更常见的情况是放置到寄存器中),以便调用函数可以获取它。如果你在堆上分配了一个对象或内存并返回指针,则它不会死亡,因为它位于堆上而不是堆栈上。然而,如果你在堆栈上分配了某些东西并将其返回,那将是很糟糕的。例如,以下任何一种情况都会非常糟糕:
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
}
当您返回一个值时,会创建一个副本。局部变量的范围结束了,但是会生成一个副本并返回到调用函数中。例如:
int funcB() {
int j = 12;
return j;
}
void A() {
int i;
i = funcB();
}
将 j 的值(12)复制并返回给 i,以便 i 接收到值为 12 的数值。
i
是一个结构体对象,那么我将&i
作为参数传递给funcB
- funcB
不返回任何内容,只是使用i
结构体成员进行计算,我需要对i
进行malloc吗?不需要,对吧?因为i
的值仍然在void A()
的范围内,所以我不用担心在funcB
完成后它的生命周期结束。 - TomSawyerstd::string someFunc( std::string& const s)
{
return s + "copy";
}
delete
来删除这个对象,如果你使用new
创建了它。std::string& someFunc2( std::string const& s)
{
return s + "reference to a copy"; // this is bad - the temp object created will
// be destroyed after the expression the
// function call is in finishes.
// Some, but not all, compilers will warn
// about this.
}