堆栈帧消失后,在堆栈上分配的对象仍然存在

时间:2019-01-04 06:47:10

标签: c++

我是C ++初学者,尽管我对C有一定的经验。我从以下来源查看了有关操作符重载的代码片段: https://www.geeksforgeeks.org/operator-overloading-c/

#include<iostream> 
using namespace std; 

class Complex { 
private: 
    int real, imag; 
public: 
    Complex(int r = 0, int i =0)  {real = r;   imag = i;} 

    // This is automatically called when '+' is used with 
    // between two Complex objects 
    Complex operator + (Complex const &obj) { 
         Complex res; 
         res.real = real + obj.real; 
         res.imag = imag + obj.imag; 
         return res; 
    } 
    void print() { cout << real << " + i" << imag << endl; } 
}; 

int main() 
{ 
    Complex c1(10, 5), c2(2, 4); 
    Complex c3 = c1 + c2; // An example call to "operator+" 
    c3.print(); 
} 

我不明白在返回“ +”后,在“ +”函数中创建的“ res”对象如何继续存在。

返回语句后是否应该删除堆栈框架及其所有内容?我的直觉说,c3已分配给一个不再存在的对象,因此对c3的print函数的调用不应起作用,因为它所引用的对象已被破坏。

如果这是C而不是C ++,则可以使用“ malloc”在堆上分配内存来保存res,这意味着它不会存在于堆栈框架中,因此不会被删除。但是似乎这里没有做任何事情。

我的推理有什么问题?这是C和C ++之间的区别,还是我记错了C的某些方面?还是两者都有?

1 个答案:

答案 0 :(得分:0)

不是。将res复制到返回值中,然后将res销毁,然后函数返回。
然后将返回值复制到c3中,然后销毁返回值。