堆栈对象"lost"会发生什么情况?
What happens to "lost" stack objects?
说 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
的初始化分配。
编辑:围绕"覆盖"争论的更仔细的措辞。
- 将指针分配给另一个指针时会发生什么情况?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 发生注入类名时会发生什么情况?(C++)
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 重新分配向量时,向量中的内存会发生什么情况
- 如果结构中的字符串比使用的 p/调用签名长或短,会发生什么情况?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 属于副本被推送到矢量的对象的指针会发生什么情况?
- 如果将变量设置为等于新对象,旧对象会发生什么情况?
- 堆栈对象"lost"会发生什么情况?
- 使用另一个(现有)对象创建新对象时会发生什么情况?
- 未分配返回未定义对象类型引用的 C++ 函数的返回值时会发生什么情况
- 将类对象用作数组的索引时会发生什么情况
- 当C++匿名对象替换以前分配的对象时会发生什么情况
- 当按引用传递参数存储在被调用方对象中,然后被调用方删除时会发生什么情况
- (C++) 堆上没有任何指针的对象会发生什么情况?
- 应用 std::move 后对象实例会发生什么情况
- 如果使用"new"实例化对象而不将其分配给变量,会发生什么情况?