假设有一个代码:
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 ++没有垃圾收集器,这是一个问题吗?
我错过了什么吗?
答案 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
,分配后同一个对象仍然存在。