堆栈对象"lost"会发生什么情况?

What happens to "lost" stack objects?

本文关键字:什么情况 对象 lost 堆栈      更新时间:2023-10-16

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)。怎么了?用什么行话来描述这个过程?垃圾收集?

我认为您误会了正在发生的事情。第二行之后,最初创建为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 没有任何垃圾收集器,因此在上面的原始对象中确实丢失了记忆泄漏的意义。

它称为"分配运算符"或" ="。

第二个对象是临时对象,而不是第一个对象。构造后,调用了第一个对象的分配运算符,将第二个对象的值分配给第一个对象。

之后,调用了第二个对象的破坏者,第二个对象被摧毁。它去哪里了?到天空中的大桶。它消失了。

这些对象不是在堆上创建的,而是直接在堆栈上创建的,因此不会丢失空间(即,没有分配的空间变得无法到达) - 分配简单地将记忆重用由Eve的初始化分配。

编辑:围绕"覆盖"争论的更仔细的措辞。