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

box*_*lk1 1 c++ stack object

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
Run Code Online (Sandbox Code Playgroud)

两个对象都在堆栈上创建.执行第二行后,无法再访问第一个对象(带参数4,3).怎么了?用于描述此过程的术语是什么?垃圾收集?

Sme*_*eey 6

我想你误解了发生的事情.最初创建的对象Eve在第二行之后不会"丢失".事实上,它之后仍然是同一个对象(我的意思是它仍然具有相同的内存地址).第二行通过调用对象上的赋值运算符为对象分配不同的值Eve.传递给赋值运算符的参数是由其创建的临时对象Pokemon(3,5).

它是所说的临时对象 - Pokemon(3,5)在第二行之后被销毁.它的破坏不是"垃圾收集"甚至是堆释放,因为它首先是一个堆栈对象,因此不需要这样.

我认为你在Java/C#或类似的托管语言方面考虑这个问题,只有对象引用而不是直接对象.在C++中使用上面的代码,你直接处理对象.要查看与您的想法相同的内容,请考虑以下事项:

Pokemon* Eve = new Pokemon(4,3); 
Eve=new Pokemon(3,5); 
Run Code Online (Sandbox Code Playgroud)

这里我们使用指针和堆,而不是堆栈.在这种情况下,第二行确实"丢失"了原始对象,因为它是重新分配的指针.这有点类似于Java/C#中正常分配的情况.当然,不同之处在于C++没有任何垃圾收集器,所以在上面,原始对象在内存泄漏的意义上真的丢失了.