栈内存储器返回一个对象后还调用它的析构函数吗

栈内存返回一个对象后还调用它的析构函数吗?
MyString类是含有一个char *m_data成员的类
这是析构函数
MyString::~MyString()

delete [] m_data;
}

这是其中一个函数,其中声明了一个MyString类型的对象,其m_data为NULL
MyString operator+(const MyString& str1,const MyString& str2) 
{
MyString tempStr; 
        ****......
return tempStr;
}

1.tempStr内存什么时候释放?是在这个函数执行完以后释放,还是在程序最后释放?
2.如果是栈内存里的对象,在跳出函数释放对象内存后,对象还会不会调用析构函数?
3.返回tempStr是值传递,返回需要先将它拷贝,如果我没有写MyString::MyString(const MyString & str);构造函数的话,会不会出错误?会出现什么错误?
内存

------解决方案--------------------
不进行返回值优化,
会函数调用前,会创建,返回值临时变量 假设名称为 result
return tempStr
会拷贝 tempStr 到 result ;result  =tempStr
返回 result
的指针到 寄存器中(Windows  Xp等 32位系统是 eax寄存器)
// pop ebp 
// lea eax,result 


假设有调用 x= operator+(s1,s2)
那么 结果就是 x= *eax = result;

如果优化 所有对 tempStr的操作,结果会变成对result的操作,result  =tempStr
的代码就不会出现, eax 依然是 result的地址,
最后如果result 被优化掉,那么对tempStr
的操作会转移到 x上来. 

这就是返回结构类型或者类类型的通常的方式

float,double 通常放在浮点寄存器堆栈中(ST)
char,short,int,long 等整型以及指针通常直接放在寄存器(eax)中返回
long long 可能会放在 (edx:eax 两个寄存器中)返回


每个硬件平台都不同,同样不同编译器,也不一定相同

不过,如果能够调用相同的API, 那么Api 那种调用约定的函数,返回值的返回方式,一定是相同的.

不论何种编程语言.