2012-06-07 93 views
1

可能重复:
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; 
    } 

回答

2

会发生什么情况?

未定义行为是什么情况!

堆栈分配的对象是局部的/自动因为这些对象的所有分配是隐含清洗一次在它们所在的端部的范围({})。

返回对本地对象的引用是未定义的行为。
未定义的行为意味着可以看到任何行为。程序可能工作,或者它可能会崩溃或随机行为。只是它不是一个有效的C++程序,任何事情都可能发生。

2

由于它是一个堆叠对象(未指针),它是否会在函数结束破坏()?

是的。

如果是这样,将其参考值分配给新对象时会发生什么?

未定义的行为。

如果您为了返回目的而创建某个东西,请按值返回。这就是价值观。

+1

如果我将堆栈对象更改为指针,则会发生相同的行为。对?? –

+0

@AjeshPN:如果你从函数*按值返回一个动态分配的指针*,那么接受返回指针的指针将指向动态内存,它将正常工作。 –

+1

@AjeshPN:返回指向堆栈分配对象的指针是未定义的行为(*从技术上讲,取消引用这样的指针是发生未定义行为的地方*) –

0

该对象将在Function()的末尾被销毁。 通过传值机制返回数据。