说Pokemon
是一个班级。请考虑以下代码段:
Pokemon Eve(4,3); //call to constructor, creating first object on the stack
Eve=Pokemon(3,5); //call to constructor again, creating a second object on the stack
两个对象都在堆栈上创建。执行第二行后,无法再访问第一个对象(带参数4,3)。怎么了?用于描述此过程的术语是什么?垃圾收集?
答案 0 :(得分:6)
我认为你误解了正在发生的事情。最初创建为Eve
的对象在第二行之后不会“丢失”。事实上,它之后仍然是同一个对象(我的意思是它仍然具有相同的内存地址)。第二行通过调用对象Eve
上的赋值运算符为对象分配不同的值。传递给赋值运算符的参数是Pokemon(3,5)
创建的临时对象。
所述临时对象 - Pokemon(3,5)
在第二行之后被销毁。它的破坏不是“垃圾收集”,甚至不是堆释放,因为它首先是一个堆栈对象,因此不需要这样。
我认为你在Java / C#或类似的托管语言方面考虑这个问题,它只有对象引用而不是直接对象。在C ++中使用上面的代码,你直接处理对象。要查看与您的想法相同的内容,请考虑以下事项:
Pokemon* Eve = new Pokemon(4,3);
Eve=new Pokemon(3,5);
这里我们使用的是指针和堆,而不是堆栈。在这种情况下,第二行确实“丢失”了原始对象,因为它是重新分配的指针。这是类似类似于Java / C#中发生的正常分配。当然,不同之处在于C ++没有任何垃圾收集器,所以在上面,原始对象在内存泄漏的意义上真的丢失了。
答案 1 :(得分:3)
它被称为“赋值运算符”或“=”。
第二个对象是临时对象,而不是第一个对象。构造之后,调用第一个对象的赋值运算符,将第二个对象的值赋给第一个对象。
之后调用第二个对象的析构函数,第二个对象被销毁。去哪儿了?天空中的大斗。它消失了。
答案 2 :(得分:1)
对象不是在堆上创建的,而是直接在堆栈上创建的,因此没有空间丢失(即,没有分配的空间变得无法访问) - 赋值只是重用{{1的初始化分配的内存}}
编辑:围绕“覆盖”争用更加谨慎的措辞。