1

假设有这样的代码:

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;
}

运算符 + 是重载的,因此它不会修改对象,而是创建一个新对象并返回它。

c2 = c1 + c2被调用时,c2与新对象绑定,但之前绑定的对象c2没有(或至少在我看来)被释放。我说的对吗?

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

我错过了什么吗?

4

2 回答 2

3

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

于 2012-05-02T18:43:17.977 回答
1

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

不,这不是发生的事情。

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

赋值运算符不会重新绑定c2(这将毫无意义——c2不是 java 样式的引用!),它会分配给它。具体来说,它调用c2.operator=(MyClass)or c2.operator=(const MyClass&)c2赋值之前存在,赋值之后同一个对象继续存在。

于 2012-05-02T19:24:26.033 回答