可能重复:
Can a local variable's memory be accessed outside its scope?
return reference to local variable
这是一个用于检查函数内部本地类对象范围的示例程序。在这里,我创建了一个A类的对象并为其赋值,并在Function()
中通过引用返回该对象。我想知道变量的范围何时结束?。因为它是一个堆栈对象(而不是指针),它是否会在Function()的末尾被破坏?如果是这样,当将其参考值分配给新对象时会发生什么?
#include "stdafx.h"
#include <iostream>
class A
{
public:
int a, b;
A(int aa, int bb)
{
a = aa;
b = bb;
}
A(){}
};
A& Function()
{
A object;
object.a = 10;
object.b = 20;
return object;
}
int _tmain(int argc, _TCHAR* argv[])
{
A aaa = Function();
std::cout<<"\nValue : "<<aaa.a<<" "<<aaa.b;
getchar();
return 0;
}
答案 0 :(得分:2)
因为它是一个堆栈对象(不是指针),它是否会在Function()的末尾被破坏?
是
如果是这样,当将其参考值分配给新对象时会发生什么?
未定义的行为。
如果要创建某些内容以便返回它,请按值返回。那是什么价值。
答案 1 :(得分:2)
会发生什么?
未定义的行为就是这样!
堆栈分配的对象是本地/自动的,因为一旦范围({
,}
)清除了这些对象的所有分配 隐式 他们住在哪里结束。
返回对本地对象的引用是一种未定义的行为 未定义的行为意味着可以看到任何行为。该程序可能会工作,也可能会崩溃或随机行为。只是它不是一个有效的c ++程序,任何事情都可能发生。
答案 2 :(得分:0)
该对象将在Function()
的末尾被破坏。
通过值机制返回数据。
答案 3 :(得分:0)
我相信你的问题在这里得到解答:In C++, is it safe to extend scope via a reference? 但是,它有点旧。您可能希望查看C ++ 11,rvalue引用和移动语义。