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

标签 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)就不能再访问了。它会发生什么?描述这个过程的术语是什么?垃圾收集?

最佳答案

我认为您误解了正在发生的事情。最初创建为 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/

相关文章:

c++ - 基于 GPU 的 N^2 比较

c++ - boost::sregex_iterator 编译错误

c++ - std::istream::read 的通用形式?

javascript - 迭代键/值对中的值时遇到问题

c++ - 栈有什么用?为什么它们在 C++ 中?

c++ - 为什么将 std::string 传递给 CString.Format() 有时只会崩溃?

javascript - Knockout JS 和简单的功能

javascript - 以不同的方式调用 javascript 函数

c - 堆栈结构如何与函数内的复合语句一起使用?

python - 当值从顶部存储时,堆栈如何向下增长?