重载运算符的内存问题

时间:2012-05-02 18:39:34

标签: c++

假设有一个代码:

class MyClass {
public:
    MyClass(int foo) : foo(foo){}

private:
    int foo;

//overloaded operator +
public:
    MyClass operator+(MyClass &mc){
        MyClass c(mc.foo + foo);
        return c;
    }
};

int main(int argc, char* argv[]){
    MyClass c1(10);
    MyClass c2(12);

    c2 = c1 + c2;

    return EXIT_SUCCESS;
}

其中operator +是重载的,它不会修改对象,而是创建一个新对象并将其返回。

当调用c2 = c1 + c2时,c2与新对象绑定,但与c2绑定的前一个对象不会(或者至少在我看来)被释放。我是对的?

由于C ++没有垃圾收集器,这是一个问题吗?

我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

对象是本地的。只有当动态分配内存时(使用new或malloc),我们才需要担心明确释放它。一旦超出范围,局部变量就会被销毁。

答案 1 :(得分:1)

  

当调用c2 = c1 + c2时,c2与新对象绑定,但与c2绑定的前一个对象不会(或者至少在我看来)被释放。

不,那不是发生了什么。

没有“先前的对象与c2绑定”; c2不是对象的引用,对象。 c2的生命周期在声明时开始,在声明超出范围时结束。

赋值运算符不重新绑定c2(这将是无意义的 - c2不是java风格的引用!),它分配给它。具体来说,它会调用c2.operator=(MyClass)c2.operator=(const MyClass&)。分配前存在c2,分配后同一个对象仍然存在。