gpt4 book ai didi

c++ - "lost"堆栈对象发生了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:21:20 26 4
gpt4 key购买 nike

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++ 没有任何垃圾收集器,因此在上述情况下,原始对象在内存泄漏的意义上确实丢失了。

关于c++ - "lost"堆栈对象发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40931547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com