2012-06-07 3 views
1

Можно создать дубликат:
Can a local variable's memory be accessed outside its scope?
return reference to local variableОбласть локального объекта

Это пример программы, написанные для проверки объема локального объекта класса внутри функции. Здесь я создаю объект класса A и присваиваю ему значения и возвращает этот объект по ссылке в 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(). Возвращает данные методом передачи по значению.

Смежные вопросы