临时对象在哪个函数帧?
临时对象在哪个函数帧?
class Test
{
int data;
char datac;
};
Test fun()
{
return Test();
};
//test
int main()
{
Test obj;
obj=fun();//这里会有2个对象,一个是Test(),一个是临时的看不见的
}
请问 这个临时的对象在哪一个栈里?
在main函数帧里,还是fun函数帧里?
[解决办法]
一般来说临时对象地址在调用函数,而不是被调函数。临时对象不一定存在,取决于编译器。
Test obj;
011515A1 lea ecx,[obj]
011515A4 call Test::Test (11511F4h)
011515A9 mov dword ptr [ebp-4],0
obj=fun(); //这里会有2个对象,一个是Test(),一个是临时的看不见的
011515B0 lea eax,[ebp-0C8h] // ebp-0c8就是临时对象的地址
011515B6 push eax
011515B7 call fun (11510A5h)
011515BC add esp,4
011515BF mov dword ptr [ebp-0CCh],eax //以下代码把临时对象赋值拷贝到obj
011515C5 mov ecx,dword ptr [ebp-0CCh]
011515CB mov dword ptr [ebp-0D0h],ecx
011515D1 mov byte ptr [ebp-4],1
011515D5 mov edx,dword ptr [ebp-0D0h]
011515DB push edx
011515DC lea ecx,[obj]
011515DF call Test::operator= (115122Bh)
011515E4 mov byte ptr [ebp-4],0
011515E8 lea ecx,[ebp-0C8h] //析构临时对象ebp-0c8h
011515EE call Test::~Test (1151073h)
fun();
011515F3 lea eax,[ebp-0A0h] //另一个临时对象epb-0a0h
011515F9 push eax
011515FA call fun (11510A5h)
011515FF add esp,4
01151602 lea ecx,[ebp-0A0h] 临时对象epb-0a0h被析构
01151608 call Test::~Test (1151073h)
return 0;
0115160D mov dword ptr [ebp-78h],0
01151614 mov dword ptr [ebp-4],0FFFFFFFFh
0115161B lea ecx,[obj]
0115161E call Test::~Test (1151073h)
01151623 mov eax,dword ptr [ebp-78h]