会发生什么事情"丢失"堆栈对象?

时间:2016-12-02 11:48:49

标签: c++ object stack

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)。怎么了?用于描述此过程的术语是什么?垃圾收集?

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的初始化分配的内存}}

编辑:围绕“覆盖”争用更加谨慎的措辞。