Проблема такая, я не понимаю где создается временная копия объекта. Мне сказали, она создается в стеке, но в стеке уже будет лежать адрес и локальные объекты, куда складывать временный объект? Теперь у меня сложилась следующая картина.
Приведу для примера код:
#include <iostream>
using namespace std;
class samp {
public:
int a;
};
samp func() //Функция возвращающая локальный объект
{
samp ob2;
ob2.a=255;
return ob2;
}
int main()
{
setlocale(0,"");
samp ob1;
ob1 = func();
system("pause");
return 0;
}
При создании объекта ob1 он попадает в стек, вот наш стек:
СТЕК:
__________
ob1
__________
Затем, вызывается функция func(), предварительно сохранив адрес для возврата в тот же стек.
Функция func() создает объект ob2, который то же ложится в стек.
СТЕК:
__________
- ob1
- адрес для возврата
- ob2
__________
Затем, func() кладет в ob2.a значение 255, и для возврата создает временную копию объекта.
СТЕК:
__________
- ob1
- адрес для возврата
- ob2
- ob2 временный
__________
Функция func() завершается и уничтожает свои локальные объекты.
Но! Это же стек.. Как он удалит ob2 и вернется по адресу если вначале лежит временный объект!?
Допустим, программа делает так:
СТЕК:
__________
- ob1
- XXX (Удалено)
- XXX (Удалено)
- ob2 временный
__________
Затем в main() ob1 забирает свое значение у "ob2 временный", хотя стек уже и не стек, и "ob2 временный" тоже удаляется.
СТЕК:
__________
ob1
__________
А если создать временный объект после раскрутки стека и возвращения в main(), то ob2 будет уже освобожден.
Вопрос:
- Что я ни так понимаю?